gpt4 book ai didi

android - 房间数据库在迁移前关闭

转载 作者:太空宇宙 更新时间:2023-11-03 13:42:57 24 4
gpt4 key购买 nike

我正在将应用程序中的旧 sqlite 数据库迁移到 Rooms,它适用于 90% 的用户。问题是它不是 100%。根据崩溃报告,设备有很多可用空间和 RAM,其中大部分是 Android 4.4 上的 Samsung Note 2。此外,我不会在应用程序的任何位置关闭数据库。

崩溃:

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)

Room 在 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),然后每个下一个调用都在关闭的数据库上执行迁移。

关于android - 房间数据库在迁移前关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47952136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com