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()]);
}
名簿をDBに挿入するコードは次のとおりです 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;
}
誰かが何かアイデアを持っていれば、この問題について助けていただければ幸いです...