2017-08-23 2 views
2

Tout fonctionnait correctement lorsque j'utilisais la version 1.0.0-alpha5 de la bibliothèque de persistance des pièces. Mais, après la mise à jour vers la version 1.0.0-alpha9, je reçois cette erreur:Bibliothèque de persistance des pièces: tentative de réouverture d'un objet déjà fermé

java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/package_name/databases/app_db

Comment puis-je résoudre ce problème?

EDIT:

J'utilise l'architecture MVP avec poignard 2. J'ai DatabaseHelper classe initialisant RoomDatabase:

@Singleton 
public class DatabaseHelper { 

private final AppDatabase appDatabase; 

@Inject 
public DatabaseHelper(@ApplicationContext Context context) { 
    appDatabase = Room.databaseBuilder(context, AppDatabase.class, "app_db").build();   
} 

public List<DifficultyEntity> getAllDifficulties() { 
     return appDatabase.difficultyDao().getAllDifficulties(); 
} 

Mon RoomDatabase:

@Database(version = 22, entities = { 
     DifficultyEntity.class, // .... 
}) 
@Singleton 
public abstract class AppDatabase extends RoomDatabase { 

    public abstract DifficultyDao difficultyDao(); 
    //.... 
} 

Quand j'appelle getAllDifficulties méthode, j'obtiens cette erreur.

est ici logcat:

java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/package_name/databases/app_db 
     at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) 
     at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1783) 
     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1729) 
     at android.arch.persistence.db.framework.FrameworkSQLiteDatabase.execSQL(FrameworkSQLiteDatabase.java:241) 
     at android.arch.persistence.room.RoomOpenHelper.createMasterTableIfNotExists(RoomOpenHelper.java:130) 
     at android.arch.persistence.room.RoomOpenHelper.checkIdentity(RoomOpenHelper.java:106) 
     at android.arch.persistence.room.RoomOpenHelper.onOpen(RoomOpenHelper.java:99) 
     at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$1.onOpen(FrameworkSQLiteOpenHelper.java:64) 
     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:266) 
     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 
     at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:106) 
     at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:82) 
     at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:191) 
     at uz.iumarov.ieltsspeaking.data.local.database.daos.RecordingDao_Impl.getAllRecordings(RecordingDao_Impl.java:167) 
     at uz.iumarov.ieltsspeaking.data.local.database.DatabaseHelper.getAllRecording(DatabaseHelper.java:361) 
     at uz.iumarov.ieltsspeaking.ui.main.recordingsFragment.RecordingsPresenter$1.call(RecordingsPresenter.java:77) 
     at uz.iumarov.ieltsspeaking.ui.main.recordingsFragment.RecordingsPresenter$1.call(RecordingsPresenter.java:74) 
     at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) 
     at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) 
     at rx.Observable.unsafeSubscribe(Observable.java:10151) 
     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48) 
     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) 
     at rx.Observable.unsafeSubscribe(Observable.java:10151) 
     at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94) 
     at rx.internal.schedulers.EventLoopsScheduler$EventLoopWorker$1.call(EventLoopsScheduler.java:172) 
     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
     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) 

EDIT 2:

Après un certain temps, j'ai commencé à autre erreur:

java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number. 
     at android.arch.persistence.room.RoomOpenHelper.checkIdentity(RoomOpenHelper.java:118) 
     at android.arch.persistence.room.RoomOpenHelper.onOpen(RoomOpenHelper.java:99) 
     at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$1.onOpen(FrameworkSQLiteOpenHelper.java:64) 
     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:266) 
     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 
     at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:106) 
     at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:82) 
     at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:191) 
     at uz.iumarov.ieltsspeaking.data.local.database.daos.RecordingDao_Impl.getAllRecordings(RecordingDao_Impl.java:167) 
     at uz.iumarov.ieltsspeaking.data.local.database.DatabaseHelper.getAllRecording(DatabaseHelper.java:361) 
     at uz.iumarov.ieltsspeaking.ui.main.recordingsFragment.RecordingsPresenter$1.call(RecordingsPresenter.java:77) 
     at uz.iumarov.ieltsspeaking.ui.main.recordingsFragment.RecordingsPresenter$1.call(RecordingsPresenter.java:74) 
     at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) 
     at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) 
     at rx.Observable.unsafeSubscribe(Observable.java:10151) 
     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48) 
     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) 
     at rx.Observable.unsafeSubscribe(Observable.java:10151) 
     at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94) 
     at rx.internal.schedulers.EventLoopsScheduler$EventLoopWorker$1.call(EventLoopsScheduler.java:172) 
     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
     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) 

Et quand je mis à jour le numéro de version, je suis getting Erreur de migration:

java.lang.IllegalStateException: A migration from 22 to 23 is necessary. Please provide a Migration in the builder or call fallbackToDestructiveMigration in the builder in which case Room will re-create all of the tables. 
     at android.arch.persistence.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:81) 
     at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$1.onUpgrade(FrameworkSQLiteOpenHelper.java:49) 
     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256) 
     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 
     at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:106) 
     at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:82) 
     at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:191) 
     at uz.iumarov.ieltsspeaking.data.local.database.daos.RecordingDao_Impl.getAllRecordings(RecordingDao_Impl.java:167) 
     at uz.iumarov.ieltsspeaking.data.local.database.DatabaseHelper.getAllRecording(DatabaseHelper.java:361) 
     at uz.iumarov.ieltsspeaking.ui.main.recordingsFragment.RecordingsPresenter$1.call(RecordingsPresenter.java:77) 
     at uz.iumarov.ieltsspeaking.ui.main.recordingsFragment.RecordingsPresenter$1.call(RecordingsPresenter.java:74) 
     at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) 
     at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) 
     at rx.Observable.unsafeSubscribe(Observable.java:10151) 
     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48) 
     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) 
     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) 
     at rx.Observable.unsafeSubscribe(Observable.java:10151) 
     at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94) 
     at rx.internal.schedulers.EventLoopsScheduler$EventLoopWorker$1.call(EventLoopsScheduler.java:172) 
     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
     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) 

S'il vous plaît, quelqu'un m'aider!

SOLVED

J'ai supprimé mon application et réinstallée. Maintenant, tout fonctionne bien avec alpha9 verison.

+0

S'il vous plaît fournir un [mcve]. Cela inclurait la totalité de la trace de la pile Java plus votre code qui déclenche la trace de la pile. – CommonsWare

+0

@CommonsWare J'ai mis à jour ma question. Jetez un coup d'oeil s'il vous plait. – Umarov

+0

@CommonsWare Je l'ai résolu. Merci de votre attention! – Umarov

Répondre

5

Vous devez fournir Migration.In Live App vous ne pouvez pas dire à chaque personne s'il vous plaît supprimer l'application et réinstaller l'application.

In Room Nouvelle version 1.0.0-alpha9 Room ajoute la prise en charge de la contrainte NOT NULL.

Cela va changer le schéma généré par Room. Parce qu'il modifie le schéma, il modifie également le identityHash de la base de données et utilisé par Room pour identifier de manière unique chaque version de base de données. Par conséquent, nous avons besoin d'une migration

Pour Migration De 1.0.0-alpha5 à 1.0.0-alpha9 s'il vous plaît visitez l'article ci-dessous. Très bon article pour migrer de l'ancienne version vers la version 1.0.0-alpha9.

https://medium.com/@manuelvicnt/android-room-upgrading-alpha-versions-needs-a-migration-with-kotlin-or-nonnull-7a2d140f05b9