从SQLite迁移到Android Room持久性库

从SQLite迁移到Android Room持久性库,android,sqlite,android-asynctask,android-room,Android,Sqlite,Android Asynctask,Android Room,我有一个应用程序正在使用SQLite数据库,我试图用Android Room API替换AndroidSQLite。我创建了DAO类、实体类和DB,但在Async任务中执行数据库查询时,我遇到以下错误: 原因:java.lang.IllegalStateException:从3迁移到1 这是必要的。请在生成器中提供迁移或调用 回退到构建器中的破坏性迁移,在这种情况下,房间将 重新创建所有表。 位于android.arch.persistence.room.RoomOpenHelper.onUpg

我有一个应用程序正在使用
SQLite
数据库,我试图用
Android Room API替换Android
SQLite
我创建了DAO类、实体类和DB,但在
Async
任务中执行数据库查询时,我遇到以下错误:

原因:java.lang.IllegalStateException:从3迁移到1 这是必要的。请在生成器中提供迁移或调用 回退到构建器中的破坏性迁移,在这种情况下,房间将 重新创建所有表。 位于android.arch.persistence.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:82) 位于android.arch.persistence.room.RoomOpenHelper.onDowngrade(RoomOpenHelper.java:94) 位于android.arch.persistence.db.FrameworkSQLiteOpenHelper$OpenHelper.ondownggrade(FrameworkSQLiteOpenHelper.java:128) 位于android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:254) 位于android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 位于android.arch.persistence.db.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:93) 位于android.arch.persistence.db.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:执行时出错 doInBackground() 在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)


我无法理解我缺少了什么,如果您能提供任何帮助,我们将不胜感激。

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

您应该将房间中的版本增加到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();

非常聪明。谢谢你。