wordpress全站转移,北京百度总部,网络游戏行业防沉迷自律公约,外贸流程ppt您好我有2个应用程序依赖于制作和恢复应用程序数据库的备份,只需将数据库文件复制到SD卡中,然后很难确定如何在关闭它之后重新打开Room Database单例以创建数据库’副本.构建数据库#xff1a;Database(version 15, exportSchema true, entities [list of entities])abstra…您好我有2个应用程序依赖于制作和恢复应用程序数据库的备份,只需将数据库文件复制到SD卡中,然后很难确定如何在关闭它之后重新打开Room Database单例以创建数据库’副本.构建数据库Database(version 15, exportSchema true, entities [list of entities])abstract class AppDatabase : RoomDatabase() {//list of DAOscompanion object {Volatile private var INSTANCE: AppDatabase? nullfun getInstance(context: Context): AppDatabase INSTANCE ?: synchronized(this) {INSTANCE ?: buildDatabase(context).also {INSTANCE it}}private fun buildDatabase(context: Context) Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,Fazendao.sqlitedb).addMigrations(Migration1315).build()}}关闭数据库fun closeDatabase() {if(db.isOpen) {db.openHelper.close()}}使数据库文件复制(在ViewModel中)fun exportaBkpObservable(nome: String, auto: String, storage: File, database: File) {disposable.clear()setFlagsNull()flagSubject.onNext(false)disposable.add(Observable.fromCallable {repo.recordBkpName(nome)}.subscribeOn(Schedulers.io()).flatMap {returnflatMap try {//closing the databaserepo.closeDatabase()Observable.just(database.copyTo(File(storage, auto), true)).flatMap {val myDb SQLiteDatabase.openOrCreateDatabase(it, null)val ok myDb.isDatabaseIntegrityOkif(myDb.isOpen) myDb.close()if(ok) {Observable.just(ok)} else {Observable.error(Throwable(CORRUPTED DATABASE))}}} catch (t: Throwable) {Observable.error(t)}}.subscribe({},{errorFlag exportDB: it.messageerrorSubject.onNext(exportDB: it.message)},{//trying to reopen databaserepo.openDatabase()trueFlag trueflagSubject.onNext(true)}))}repo是注入AppDatabase的存储库,然后在ViewModelFactory中注入.注射object MainInjection {private fun providesIORepo(context: Context): IORepo {return IORepo(AppDatabase.getInstance(context))}fun provideIOViewModelFactory(context: Context): IOViewModelFactory {val data providesIORepo(context)return IOViewModelFactory(data)}}在AppCompatActivity onCreate中val modelFactory MainInjection.provideIOViewModelFactory(this)viewModel ViewModelProviders.of(this, modelFactory).get(IOViewModel::class.java)重新打开数据库fun openDatabase() {if(!db.isOpen){db.openHelper.writableDatabase}}现在错误消息试图重新打开数据库E/ROOM: Invalidation tracker is initialized twice :/.因此当我尝试从另一个函数访问它时崩溃Cannot perform this operation because the connection pool has been closed.关闭数据库后,我有时也会E/ROOM: Cannot run invalidation tracker. Is the db closed?在这篇文章Incrementally migrate from SQLite to Room中,作者为每次访问它打开和关闭数据库,所以我不明白为什么我的实现不起作用.那我在哪里错了有没有办法停用InvalidationTracker我是否应该使用以下代码关闭数据库并在每次必须复制数据库文件时清除Room实例.安全吗fun destroyInstance() {if (INSTANCE?.isOpen true) {INSTANCE?.close()}INSTANCE null}感谢您的关注.解决方法:好的,我开始使用以下代码关闭数据库fun destroyInstance() {if (INSTANCE?.isOpen true) {INSTANCE?.close()}INSTANCE null}并实现了如下导入数据库fun importaBkpObservable(origin: File, database: File) {disposable.clear()setFlagsNull()flagSubject.onNext(false)disposable.add(Observable.fromCallable {try {repo.closeDatabase()val myDb SQLiteDatabase.openOrCreateDatabase(origin, null)val ok myDb.isDatabaseIntegrityOkif (myDb.isOpen) myDb.close()if(ok) {origin.copyTo(database, true)} else {CORRUPTED DATABASE}} catch (t: Throwable) {t.message}}.subscribeOn(Schedulers.io()).subscribe({if(it ! null) {if(it is String) {errorFlag exportDB: $iterrorSubject.onNext(exportDB: $it)} else {trueFlag trueflagSubject.onNext(true)}} else {errorFlag exportDB: GENERICerrorSubject.onNext(exportDB: GENERIC)}},{errorFlag exportDB: ${it.message}errorSubject.onNext(exportDB: ${it.message})}))}我曾经通过startActivityForResult()从我的主要活动导航到导入/导出活动,但现在已经更改为startActivity()在此调用之后完成我的主要活动.导入/导出完成后,我使用startActivity()调用我的主活动,然后完成导入/导出活动.这样我的主要活动ViewModel再次使用新的AppDatabase实例进行实例化,并且一切正常.我查看了Android Profiler,经过多次导入和导出后,内存使用量介于90 MB到130 MB之间,与之前没有关闭数据库时一样,所以我想我没有遇到某种内存泄漏或累积Room Databases实例.我还应该检查什么标签android,android-room来源 https://codeday.me/bug/20190622/1262676.html