2013-09-29 5 views
2

Я выпустил обновление своего приложения, и я получаю массу ошибок от пользователей, и я не могу его воссоздать или указать проблему.SQLiteDatabase Ошибка, бесполезный Журнал

Две ошибки я получаю: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase

java.lang.IllegalStateException: database not open

ошибка происходит где-то в следующем коде:

public DBUserC getUser(int _id){ 
     synchronized (DBAdapter.LOCK){ 
      M.openDB(context); 
      Cursor cursor = M.database.query(DBUserHelper.TABLE_USERS, 
        VUser.allColumns, DBUserHelper.COLUMN_ID + " = '"+_id+"'", null, null, null, null); 
      DBUserC user; 
      if (cursor.moveToFirst()){ 
       user = cursorToInfo(cursor); 
      } else{ 
       user = newUser(); 
      } 
      cursor.close(); 
      M.closeDB(); 
      return user; 
     } 
     } 

В этой версии есть обновление базы данных, в который я выполняю три запроса через db.execSql. Это не в отдельном потоке.

При каждом вызове базы данных (за исключением onUpgrade) я синхронизирую, затем открываю его, запускаю свой код и закрываю его. У меня не было проблем до этого обновления и я не могу найти проблему.

Любая помощь была бы принята с благодарностью.

EDIT: Чтобы открыть мои databas, я:

if (helper==null) 
    helper = new DBAdapter(context); 
if (database==null){ 
    database = helper.getWritableDatabase(); 
} else if (!database.isOpen()) 
    database = helper.getWritableDatabase(); 

и закрыть: метод

helper.close(); 
helper = null; 
database = null; 

Пример для получения информации:

public DBUserC getUser(int _id){ 
     synchronized (DBAdapter.LOCK){ 
      openDB(context);//this is the open code above 
      Cursor cursor = M.database.query(DBUserHelper.TABLE_USERS, 
        VUser.allColumns, DBUserHelper.COLUMN_ID + " = '"+_id+"'", null, null, null, null); 
      DBUserC user; 
      if (cursor.moveToFirst()){ 
       user = cursorToInfo(cursor);//does not contain DB operations 
      } else{ 
       user = newUser(); ////does not contain Database operations 
      } 
      cursor.close(); 
      closeDB();//This is the close code above 
      return user; 
     } 
    } 

AHost. onCreate

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     M.initializeDB(context); //synchronized call to the openDB code I posted above 
     M.openDataDB(context); //opens a different database by a different file name. This DB is not an issue 

     //irrelevant ui setup 
     int _id = pref.getInt(P.eLastUser, VUser.ID_NEW);//row id of user 

     M.requeryUser();//synchronized, access database 
     M.switchUser(_id);//synchronized, access database 

    } 
+1

Это не понятно! вы имеете в виду, например, использование: '


' tag? –

+0

Можете ли вы разместить содержание AHost onCreate()? – LairdPleng

+0

Я разместил все соответствующие коды 'onCreate'. Я могу отправить M.requeryUser() и M.switchUser(), если это необходимо, но это будет довольно длинным – Jakar

ответ

0

я не мог воссоздать проблему, потому что в тестировании, я модернизировал от DB версии 3 до версии 4. Многие из моих пользователей были обновления с версии 2 до версии 4. Некоторые из кода для обновления от 2 до 3 была основана на методе. Я закончил тем, что изменил некоторые из этих методов для версии 4, которые нарушили обновление версии 3. Затем я получил исключение catch из метода cursorToObject(), который вызвал пропущение базы данных.close, а затем я получил исключение sqlite

+1

Бесстыдный плагин: в прошлом я сталкивался с подобными проблемами, и я пришел к выводу, что если вы хотите иметь независимые миграции, то есть хотите, чтобы добавление новой миграции не нарушало миграцию из более ранних версий, вам нужно сохранить старый db определения схемы. Я написал библиотеку, чтобы сделать это проще и уменьшить шаблон: https://github.com/futuresimple/android-schema-utils. Надеюсь, вы сочтете это полезным. – chalup

1

У меня возникла одна и та же проблема в одном из моих приложений и как Я решил, что проблема заключается в удалении cursor.close(). Надеюсь, это поможет :)

0

Очевидно, нам необходимо увидеть, что метод on-upgrade, по-видимому, является основной причиной вашей проблемы. Я использую Adams Upgrade method Я назвал его для блога, который я нашел в нем.

примечание: каждое обновление выполняется при обновлении до < = newVersion. Может быть, когда-нибудь я поставлю индикатор прогресса в этом цикле.

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    int upgradeTo = oldVersion + 1; 
    while (upgradeTo <= newVersion) { 
     switch (upgradeTo) { 
     // update old resrawid's to constants 
     // this was caused when I saved R values in the database 
     // and then later realized they would change. 
     // the old resrawid is changed to a constant. 
     case 42: 
      ContentValues values; 
      @SuppressWarnings("unused") 
      // used for debugging so I can see the value of the update. 
      int res; 
      int rs; 
      rs = 2130968576; 
      values = new ContentValues(); 
      values.put(
        KEY_RESRAWID, 
        com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_DRAGON); 
      res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?", 
        new String[] { String.valueOf(rs) }); 

      rs = 2130968577; 
      values = new ContentValues(); 
      values.put(
        KEY_RESRAWID, 
        com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_M119); 
      res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?", 
        new String[] { String.valueOf(rs) }); 

      rs = 2130968578; 
      values = new ContentValues(); 
      values.put(
        KEY_RESRAWID, 
        com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_MEDINA); 
      res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?", 
        new String[] { String.valueOf(rs) }); 
      break; 
     case 43: 
      // new column added for last_viewed. 
      db.execSQL(VERSION_43_ALTER); 
      break; 

     case 44: 
      // new index on KEY_DATE_UPDATE DESC 
      db.execSQL(VERSION_44_CREATE_INDEX); 
     } 
     upgradeTo++; 
    } 
} 

Good Luck Danny117

+0

Я уже сам решил проблему (см. Мой ответ), но я ценю усилия и информацию. – Jakar

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