Android 请在生成器中提供迁移,或在生成器中调用Fallback ToDestructiveMigration,在这种情况下,Room将重新创建所有表
我正在使用RxJava2的房间。我在表中添加了一列,因此我正在迁移到新版本。我已将数据库版本更改为2 下面是我的迁移代码Android 请在生成器中提供迁移,或在生成器中调用Fallback ToDestructiveMigration,在这种情况下,Room将重新创建所有表,android,android-room,Android,Android Room,我正在使用RxJava2的房间。我在表中添加了一列,因此我正在迁移到新版本。我已将数据库版本更改为2 下面是我的迁移代码 static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE users " +"
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE users "
+"ADD COLUMN address String");
}
};
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, DB_NAME)
.addMigrations(MIGRATION_1_2)
.build();
https://github.com/alahammad/RoomSample
如果您想查看完整的代码,
我在Github上引用了这个示例,它没有迁移代码
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE users "
+"ADD COLUMN address String");
}
};
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, DB_NAME)
.addMigrations(MIGRATION_1_2)
.build();
https://github.com/alahammad/RoomSample
我正在遵循文档中描述的步骤,但我的应用程序仍然崩溃
错误日志
Process: demo.karaoke.sensibol.com.roomrajava2, PID: 13655
io.reactivex.exceptions.OnErrorNotImplementedException: A migration from 1 to 2 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 io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
at io.reactivex.internal.operators.maybe.MaybeCallbackObserver.onError(MaybeCallbackObserver.java:83)
at io.reactivex.internal.operators.maybe.MaybeObserveOn$ObserveOnMaybeObserver.run(MaybeObserveOn.java:99)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5643)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: java.lang.IllegalStateException: A migration from 1 to 2 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.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.java:118)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256)
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 demo.karaoke.sensibol.com.roomrajava2.UserDao_Impl$4.call(UserDao_Impl.java:137)
at demo.karaoke.sensibol.com.roomrajava2.UserDao_Impl$4.call(UserDao_Impl.java:135)
at io.reactivex.internal.operators.maybe.MaybeFromCallable.subscribeActual(MaybeFromCallable.java:46)
at io.reactivex.Maybe.subscribe(Maybe.java:3749)
at io.reactivex.internal.operators.maybe.MaybeSubscribeOn$SubscribeTask.run(MaybeSubscribeOn.java:54)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
我从GitHub运行了你的应用程序,并从版本1迁移到版本2。结果发现SQL查询中有一个错误。应该是:
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE users "
+"ADD COLUMN address TEXT");
}
};
字符串>文本
最好将Room的数据库实例设置为单例,并且只在Repo/CacheManager类中使用它。请检查完整代码更改的要点-在生成()之前添加“.fallbackToDestructiveMigration()”,如果您不想提供迁移,并且特别希望在升级版本时清除数据库,请在数据库生成器中调用
fallbackToDestructiveMigration
database = Room.databaseBuilder(context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.fallbackToDestructiveMigration()
.build();
如果可以接受丢失现有数据,请在创建数据库时调用
fallbackToDestructiveMigration()
builder方法
示例:
db = Room.databaseBuilder(getApplicationContext(),
User.class, "DB_Name")
.fallbackToDestructiveMigration()
.build();
在生成()之前添加“.fallbackToDestructiveMigration()”,
同时也增加了你的版本号。希望有人能找到它。这里。您可以添加错误吗logs@AmjadKhan我已经添加了错误日志,请看一看您是否已将@Database(entities={},version=1)注释添加到AppDatabase类中?您是否在手机上安装了版本1,然后使用migration和version=2更新代码并尝试安装?@lomza是的,我这样做了。对于Version1@Database(entities={User.class},Version=1),我在手机上安装了应用程序,然后添加了一列并更改了@Database(entities={User.class},Version=2),然后再次在手机上安装了应用程序。有一篇关于迁移的好文章-也许你会在那里找到解决方案……谢谢你的回答。让我查一查,然后给你回电话。你抽出时间检查我的代码对我来说真的很重要。欣赏它即使我写的是字符串而不是文本,它也能工作。问题出在我的Singleton类中,您在中提供了该类,但前提是您希望用户释放所有保存的数据