从SQLite迁移到Android Room Persistence Library

时间:2018-01-10 02:51:14

标签: android sqlite android-asynctask android-room

我有一个正在使用SQLite数据库的应用,我正在尝试用SQLite替换Android Android Room API.我创建了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)                                                                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)                                                                     at 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)                                                                        at 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 个答案:

答案 0 :(得分:3)

您正试图从SQLite db版本3迁移到Room db版本1.当然ROOM使用相同的db和版本控制(它只是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();