从 SQLite 迁移到 Android Room Persistence Library

Posted

技术标签:

【中文标题】从 SQLite 迁移到 Android Room Persistence Library【英文标题】:Migrating from SQLite to Android Room Persistence Library 【发布时间】:2018-06-19 03:52:38 【问题描述】:

我有一个使用SQLite 数据库的应用程序,我正在尝试用android Room API. 替换Android SQLite 我已经创建了DAO 类、实体类和数据库,但是在Async 任务中执行数据库查询时我出现以下错误:

原因:java.lang.IllegalStateException:从 3 迁移到 1 有必要的。请在构建器中提供迁移或致电 构建器中的 fallbackToDestructiveMigration 在这种情况下 Room 将 重新创建所有表。 在 android.arch.persistence.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:82) 在 android.arch.persistence.room.RoomOpenHelper.onDowngrade(RoomOpenHelper.java:94) 在 android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onDowngrade(FrameworkSQLiteOpenHelper.java:128) 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:254) 在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 在 android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:93) 在 android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54) 在 android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:193) 在 com.rasfi.ai.domain.room.RecordingDAO_Impl.getAll(RecordingDAO_Impl.java:112) 在 com.rasfi.ai.ui.acivities.HomeActivity$1.doInBackground(HomeActivity.java:106) 在 com.rasfi.ai.ui.acivities.HomeActivity$1.doInBackground(HomeActivity.java:102) 在 android.os.AsyncTask$2.call(AsyncTask.java:304) 在 java.util.concurrent.FutureTask.run(FutureTask.java:237) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 在 java.lang.Thread.run(Thread.java:760) 01-10 08:13:37.648 30267-30339/com.rasfi.ai E/UncaughtException: java.lang.RuntimeException:执行时发生错误 做背景() 在 android.os.AsyncTask$3.done(AsyncTask.java:318) 在 java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 在 java.util.concurrent.FutureTask.setException(FutureTask.java:223) 在 java.util.concurrent.FutureTask.run(FutureTask.java:242) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)

我无法理解我缺少什么,任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您正在尝试从 SQLite db 版本 3 迁移到 Room db 版本 1。确定 ROOM 使用相同的数据库和版本控制(它只是 SQLite 上的抽象层),您的房间不知道如何管理从版本开始3比1。

您应该将 Room 中的版本增加到 4 并指定空迁移:

static final Migration MIGRATION_3_4 = new Migration(3, 4) 
    @Override
    public void migrate(SupportSQLiteDatabase database) 
// Since we didn't alter the table, there's nothing else to do here.
    
;

将其添加到房间:

database = Room.databaseBuilder(context.getApplicationContext(),
        UsersDatabase.class, "Sample.db")
        .addMigrations(MIGRATION_3_4)
        .build();

【讨论】:

非常聪明。谢谢你。

以上是关于从 SQLite 迁移到 Android Room Persistence Library的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Room 数据库中获取 SQLite 数据库实例引用?

如何将现有的 sqlite 表迁移到具有 VARCHAR、TIMESTAMP 等数据类型的 ROOM Db?

Android使用Room操作SQLite数据库让其变得无比高效和简洁(进一步完善用RecyclerView显示数据库中的数据)

Android房间迁移null错误

Android 数据库 Room从入门到进阶

Android 使用Room操作SQLite数据库让其变得无比高效和简洁(前一篇文章的完善)