我在我的Android应用程序中使用SQLite DB存储足球运动员并维护他们所属的名单。管理这些名单的活动能够打开2个对话窗口,1个用于将当前名单保存到数据库,1个用于从数据库加载现有名单。
当保存名单然后打开加载名单的对话框时,在我对现有名单的查询中找不到新保存的名单。如果我退出活动并重新启动它,则会列出新的名单,并且可以正常加载。
以下是查询DB以查找现有名册的代码
public String[] fetchRosterNames() {
String query = "SELECT "+ _ID + ", " + ROSTER_NAME + ", COUNT(" + ROSTER_NAME + ") As `NUM_PLAYERS`" +
" FROM " + TABLE_NAME +
" GROUP BY " + ROSTER_NAME;
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(query, null);
ArrayList<String> rosterNames = new ArrayList<String>();
if(cursor.getCount() > 0){
while(!cursor.isLast()){
cursor.moveToNext();
rosterNames.add(cursor.getString(1));
}
}
cursor.close();
db.close();
return rosterNames.toArray(new String[rosterNames.size()]);
}
这是将名单插入数据库的代码 public void insertRoster(String roster_name,leagueRoster roster){
SQLiteDatabase db = getWritableDatabase();
Iterator<Player> players = roster.getFullRoster();
while(players.hasNext()){
Player player = players.next();
ContentValues values = new ContentValues();
Log.e("MySQLiteHelper: insertRoster()", player.getName());
values.put(PlayerStats.NAME.name(), player.getName());
values.put(PlayerStats.POSITION.name(), player.getPosition().name());
values.put(PlayerStats.TEAM.name(), player.getTeam().name());
values.put(ROSTER_NAME, roster_name);
db.insertOrThrow(TABLE_NAME, null, values);
}
db.close();
}
最后,我的活动中的代码创建了2个不同的对话框
protected Dialog onCreateDialog(int id){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
switch(id) {
case 1:
final MySQLiteHelper rosterData = new MySQLiteHelper(this);
final String[] items = rosterData.fetchRosterNames();
builder.setTitle("Select the roster you would like to load");
builder.setItems(items, new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("Roster Names Dialog", items[which]);
LeagueRoster loadedRoster = rosterData.fetchRoster(items[which]);
if(loadedRoster != null){
roster = loadedRoster;
db.setRoster(roster);
redrawTables();
}
}
});
dialog = builder.create();
break;
case 2:
default:
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
View saveRosterView = inflater.inflate(R.layout.saveroster_dialog, null);
builder.setView(saveRosterView);
final EditText nameField = (EditText)saveRosterView.findViewById(R.id.saveroster_dialog_editText);
Button saveButton = (Button)saveRosterView.findViewById(R.id.saveroster_dialog_button);
saveButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
MySQLiteHelper rosterData = new MySQLiteHelper(RosterActivity.this);
String rosterName = nameField.getText().toString();
rosterData.insertRoster(rosterName, roster);
dialog.dismiss();
}
});
dialog = builder.create();
break;
}
return dialog;
}
如果有人有任何想法,我会非常感谢这个问题的帮助......
答案 0 :(得分:0)
很奇怪,但在每次插入后尝试db.commit()?
答案 1 :(得分:0)
好的,我发现了问题。它与Android如何处理Dialogs而不是SQLite有关。来自Android文档...
http://developer.android.com/guide/topics/ui/dialogs.html
如果您使用onCreateDialog(int)来管理您的状态 对话框(如上一节所述),然后每次你的 对话框被关闭,Dialog对象的状态被保留 活动。如果您决定不再需要此对象或 国家被清除是很重要的,那么你应该打电话 removeDialog(INT)。这将删除&gt;对其的任何内部引用 对象,如果对话框显示,它将解除它。
确保每次按下“加载按钮”时都完全重新创建对话框,修复了问题。以前,SQLite查询没有重新运行,因此无法为对话框提供新数据。
感谢大家的帮助!