android-会议室数据库在迁移前已关闭
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了android-会议室数据库在迁移前已关闭,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2795字,纯文字阅读大概需要4分钟。
内容图文
![android-会议室数据库在迁移前已关闭](/upload/InfoBanner/zyjiaocheng/883/e6de3ef5d0854372a72af87ea1811e98.jpg)
我正在将旧的sqlite db在应用程序中迁移到“房间”,它可为90%的用户使用.问题是不是100%.
根据崩溃报告,设备具有大量可用空间和RAM,其中大多数是Android 4.4上的Samsung Note 2.另外,我不会在应用程序中的任何位置关闭db.
崩溃:
Fatal Exception: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.szyk.myheart/databases/database.db
at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1648)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594)
at android.arch.persistence.db.framework.FrameworkSQLiteDatabase.execSQL(SourceFile:240)
at com.szyk.myheart.data.room.Migrations$1.migrate(SourceFile:16)
at android.arch.persistence.room.RoomOpenHelper.onUpgrade(SourceFile:73)
at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(SourceFile:118)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:257)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(SourceFile:93)
at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(SourceFile:54)
at android.arch.persistence.room.RoomDatabase.inTransaction(SourceFile:305)
at android.arch.persistence.room.InvalidationTracker$1.run(SourceFile:281)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:838)
在Dagger模块中初始化房间:
@Provides
@ApplicationScope
public static Database provideDatabase(Context context) {
return Room
.databaseBuilder(context, Database.class, "database.db")
.allowMainThreadQueries()
.addMigrations(Migrations.MIGRATION_25_to_26)
.addMigrations(Migrations.newDummyMigration(26, 27))
.build();
}
迁移代码:
public class Migrations {
public static final Migration MIGRATION_25_to_26 = new Migration(25, 26) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
Timber.d("Migrating to room");
Timber.d("Migration - creating new tables");
// Create the new table - it fails on first call to db
database.execSQL(
"CREATE TABLE IF NOT EXISTS users_new (_id INTEGER PRIMARY KEY AUTOINCREMENT, user_name TEXT NOT NULL, user_birth_date INTEGER, is_diabetes INTEGER NOT NULL)");
...
Timber.d("Migration - completed");
}
};
public static Migration newDummyMigration(int from, int to) {
return new Migration(from, to) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
}
};
}
}
解决方法:
问题在于迁移本身.它第一次崩溃是无声地吞下一个异常(Rx),然后每个下一个调用在关闭的db上执行迁移.
内容总结
以上是互联网集市为您收集整理的android-会议室数据库在迁移前已关闭全部内容,希望文章能够帮你解决android-会议室数据库在迁移前已关闭所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。