从SQLite迁移到Android Room Persistence Library [英] Migrating from SQLite to Android Room Persistence Library

查看:90
本文介绍了从SQLite迁移到Android Room Persistence Library的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have an app which is using SQLite database and I am trying to replace Android SQLite with Android Room API. I have created DAO class, Entity class, and DB but while executing database query in Async task I am getting following error:

由以下原因引起: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:执行时发生错误 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)

Caused by: java.lang.IllegalStateException: A migration from 3 to 1 is necessary. Please provide a Migration in the builder or call fallbackToDestructiveMigration in the builder in which case Room will re-create all of the tables. at android.arch.persistence.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:82) at android.arch.persistence.room.RoomOpenHelper.onDowngrade(RoomOpenHelper.java:94) at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onDowngrade(FrameworkSQLiteOpenHelper.java:128) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:254) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:93) at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54) at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:193) at com.rasfi.ai.domain.room.RecordingDAO_Impl.getAll(RecordingDAO_Impl.java:112) at com.rasfi.ai.ui.acivities.HomeActivity$1.doInBackground(HomeActivity.java:106) at com.rasfi.ai.ui.acivities.HomeActivity$1.doInBackground(HomeActivity.java:102) at android.os.AsyncTask$2.call(AsyncTask.java:304) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at 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)  at java.lang.Thread.run(Thread.java:760)  01-10 08:13:37.648 30267-30339/com.rasfi.ai E/UncaughtException: java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:318) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at 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)

我无法理解我所缺少的内容,我们将不胜感激.

I am unable to understand what I am missing, any help would be appreciated.

推荐答案

您正试图从SQLite数据库版本3移至Room数据库版本1.确保ROOM使用相同的数据库和版本控制(这只是SQLite上的抽象层) ),您的房间不知道如何管理从版本3到版本1的变化.

You are trying to move from SQLite db version 3 to Room db version 1. Sure the ROOM uses the same db and versioning(it is only abstraction layer over SQLite), your room doesn't know how to manage going from version 3 to 1.

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

You should increase version in Room to 4 and specify empty migration:

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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆