数据库
首页 > 数据库> > android-会议室数据库在迁移前已关闭

android-会议室数据库在迁移前已关闭

作者:互联网

我正在将旧的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-room,android-architecture-components,sqlite,android-sqlite,android
来源: https://codeday.me/bug/20191110/2014079.html