2017-09-26 15 views
1

私はプロダクションモードでルームパーシスタンスを使用するアプリを持っています。それは私がテーブルを更新しようとすると、私はいくつかのデバイスで次のエラーがあるようだ:データベースとの私の接続は、すべての時間を開くだけで、破棄私はデータベースを解放します。部屋のパーシスタンスエラー

これは、12時間ごとに

これはサービスで実行される私のサービスです。https://gist.github.com/anonymous/8fac7650b34aa19229d5f6b91d2454d4 DataRepo: https://gist.github.com/anonymous/70c524c1e8eb5e7ed893131a9c685b5b AppDatabase https://gist.github.com/anonymous/ccb20853054fa5d453592fd2653a4dc4

エラー:

java.lang.IllegalStateException: 
    at android.database.sqlite.SQLiteDatabase.throwIfNotOpenLocked 
    (SQLiteDatabase.java:2199) 
    at android.database.sqlite.SQLiteDatabase.createSession 
    (SQLiteDatabase.java:379) 
    at android.database.sqlite.SQLiteDatabase$1.initialValue 
    (SQLiteDatabase.java:92) 
    at android.database.sqlite.SQLiteDatabase$1.initialValue 
    (SQLiteDatabase.java:89) 
    at java.lang.ThreadLocal$Values.getAfterMiss (ThreadLocal.java:430) 
    at java.lang.ThreadLocal.get (ThreadLocal.java:65) 
    at android.database.sqlite.SQLiteDatabase.getThreadSession 
    (SQLiteDatabase.java:373) 
    at android.database.sqlite.SQLiteProgram.getSession (SQLiteProgram.java:101) 
    at android.database.sqlite.SQLiteStatement.executeUpdateDelete 
    (SQLiteStatement.java:64) 
    at android.arch.persistence.db.framework.FrameworkSQLiteStatement.executeUpdateDelete (FrameworkSQLiteStatement.java:75) 
    at android.arch.persistence.room.EntityDeletionOrUpdateAdapter.handle (EntityDeletionOrUpdateAdapter.java:69) 
     at mbc.analytics.sdk.room.dao.TimeDao_Impl.updateTimeModel (TimeDao_Impl.java:122) 
     at mbc.analytics.sdk.room.database.DatabaseRepository.createTimeEntity (DatabaseRepository.java:211) 
     at mbc.analytics.sdk.room.database.DatabaseRepository.createAppEntity (DatabaseRepository.java:56) 
     at mbc.analytics.sdk.services.LollipopService.getStats (LollipopService.java:202) 
     at mbc.analytics.sdk.services.LollipopService.access$900 (LollipopService.java:39) 
    at mbc.analytics.sdk.services.LollipopService$2.run (LollipopService.java:153) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run (Thread.java:818) 
+0

DBを決して閉じないでください。関連するコードを共有できますか? –

+0

このコードはサービスの中にあります。 – Cliff

+0

@XavierRubioJansana私の編集を確認してください – Cliff

答えて

1

DatabaseRepositoryがコールをラップしているがRoom.databaseBuilder()になります。これはシングルトンを使用して実装されているため、databaseRepository.databaseClose();の呼び出しでデータベースを終了していますが、再び開くことはできません。 AppDatabase.getAppDatabase(ctx);は同じ閉じたデータベースを返すので、コード内に新しいDatabaseRepositoryを作成することは役に立ちません。

ので、可能な解決策は次のようになります。

  • サービスは、あなたの活動の他の部分と同じApplication内部で実行され、データベースがある(とする必要があります)共有として、databaseRepository.databaseClose();への呼び出しを削除してください。 これは私の意見では好ましい解決策です
  • DatabaseRepository#databaseClose()は、AppDatabase.destroyInstance();を呼び出すことによってデータベースオブジェクトも破棄することになります。

    :秒、お勧めできませんソリューションのコード

など、私には、これがあるが、他の問題を提起することができ、並行性の問題と同様に、(例えば活動に)古いデータベースオブジェクトへの参照を保持
public void databaseClose() { 
    if (db.isOpen()) { 
     db.close(); 
     AppDatabase.destroyInstance(); 
    } 
} 
関連する問題