2014-01-18 4 views
0

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

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

java.lang.IllegalStateException: database not open
Оба происходят в

at com.jakar.package.dj.a(Unknown Source) 
at com.jakar.package.fi.a(Unknown Source) 
at com.jakar.package.AHost.onCreate(Unknown Source) 

, отображающая в

at com.jakar.package.DBUserS.getUser(Unknown Source) 
            saveUser 
            getAllInfo 
            cursorToInfo 
at com.jakar.package.M.switchUser(Unknown Source) 
          requeryUser 
          createAlerts 
          addTab 
          hasScheduleData 
          getRandom 
          round 
at com.jakar.workschedule.AHost.onCreate(Unknown Source) 

В этой версии есть обновление базы данных , в котором я выполняю три запроса через 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; 
     } 
    } 
+0

Кроме того, я рад наградить щедрость тому, кто помогает мне найти/решить проблему. Я, к сожалению, не могу выставить его за щедрость на 2 дня. – Jakar

+0

Иногда я сталкиваюсь с такой же проблемой, поэтому я думаю, что этот тип ошибки возрастает, когда вы вызываете какую-либо операцию db после вызова 'db.close()' .. –

+0

, где это закрытие называется ? – Triode

ответ

0

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

0

Я знаю за то, что java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase приходит, когда вы фактически не закрываете t он базы данных должным образом, что не обязательно означает, что вы закрываете свою базу данных в текущей деятельности, это может быть связано с любым другим действием, которое пытается получить доступ к базе данных.

Кроме того, при открытии базы данных, необходимо закрыть базу данных о других ваших activity lifecycle событий, а также, например:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    ... 
    db.open(); 
    //some operation 
    db.close(); 
} 

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    if(db != null) 
     db.close(); 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    if(db != null) 
     db.close(); 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    db.open(); 
} 
Смежные вопросы