2012-05-30 1 views
0

Я использую 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; 
} 

Я был бы очень признателен за помощь в этом вопросе, если у кого-нибудь есть идеи ...

+0

То, как вы выбираете имена списков из Курсора, действительно чрезмерно сложно. Вы можете сделать это гораздо проще. См. Http://stackoverflow.com/a/10723771/385478 –

+0

Спасибо за отзыв, выглядит намного чище – Arutal

ответ

0

Хорошо, я понял проблему. Это связано с тем, как Android обрабатывает диалоговые окна, а не SQLite. Из Android документации ...

http://developer.android.com/guide/topics/ui/dialogs.html

Если вы используете onCreateDialog (INT) для управления состоянием ваших диалогов (как описан в предыдущем разделе), то каждый раз, когда ваш диалог является уволен, состояние объекта Dialog сохраняется в действии . Если вы решите, что вам больше не понадобится этот объект или , важно, чтобы состояние было очищено, тогда вы должны позвонить removeDialog (int). Это приведет к удалению> любых внутренних ссылок на объект , и если диалог показывается, он отклонит его.

Убедившись, что диалог был полностью воссоздан каждый раз, когда была нажата кнопка загрузки, исправлена ​​проблема. Ранее SQLite-запрос не был повторно запущен и, следовательно, не смог предоставить диалог с новыми данными.

Спасибо за помощь всем!

0

Странно, но попробуйте db.commit() после каждой вставки?

+0

SQLiteDatabase не имеет метода commit() – Arutal

+0

Nah, это endTransaction(). Я столкнулся с этой проблемой, но не в Android, просто с несколькими процессами unix, попавших в одну и ту же базу данных. Я * думаю *, я решил, что посыпания совершают вокруг. – Torp

+0

Я попытался поставить beginTransaction() перед вставкой и setTransactionSuccessful() и endTransaction() после, но, похоже, это не исправляет проблему. – Arutal

 Смежные вопросы

  • Нет связанных вопросов^_^