Я использую SQLite DB в своем приложении для Android, чтобы хранить футболистов и поддерживать список, к которым они принадлежат. Активность, которая управляет этими списками, имеет возможность открыть 2 диалоговых окна, 1 сохранить текущий список в db и 1, чтобы загрузить существующий список из db.Мой SQL-запрос SQLite 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()]);
}
вот код, который вставляет список в БД общественности ничтожной insertRoster (String roster_name, LeagueRoster список) {
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;
}
Я был бы очень признателен за помощь в этом вопросе, если у кого-нибудь есть идеи ...
То, как вы выбираете имена списков из Курсора, действительно чрезмерно сложно. Вы можете сделать это гораздо проще. См. Http://stackoverflow.com/a/10723771/385478 –
Спасибо за отзыв, выглядит намного чище – Arutal