在RoomDatabase迁移过程中,我们看到越来越多的Fabric崩溃。任何解决这个问题的建议
RoomDatabase初始化:
companion object {
fun createNotesDatabase(androidContext: Context): NotesDatabase {
try {
return Room.databaseBuilder(androidContext, NotesDatabase::class.java, "notesdb")
.fallbackToDestructiveMigration()
.build()
} catch (e: Exception) {
Log.e("NotesDatabase", "exception")
}
}
}
异常的堆栈跟踪:
Fatal Exception: java.lang.IllegalStateException: A migration from 1 to 4 was required but not found. Please provide the necessary Migration path via RoomDatabase.Builder.addMigration(Migration ...) or allow for destructive migrations via one of the RoomDatabase.Builder.fallbackToDestructiveMigration* methods.
at android.arch.persistence.room.RoomOpenHelper.onUpgrade + 97(RoomOpenHelper.java:97)
at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade + 133(FrameworkSQLiteOpenHelper.java:133)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked + 400(SQLiteOpenHelper.java:400)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase + 298(SQLiteOpenHelper.java:298)
at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase + 96(FrameworkSQLiteOpenHelper.java:96)
at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase + 54(FrameworkSQLiteOpenHelper.java:54)
at com.limemobile.notes.data.local.NotesDatabase_Impl.clearAllTables + 280(NotesDatabase_Impl.java:280)
发布于 2019-10-05 04:43:07
你需要做三件事中的一件:-
哪个选项将取决于未提供的信息,您可能希望阅读用房间理解迁移。
附加内容
下面是一个示例,其中onDestructiveMigration方法被重写为什么也不做(数据库表有效地清除了任何数据,但将存在)。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAppDB = Room.databaseBuilder(
this,
AppDatabase.class,
"the_database"
)
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.addCallback(dbCallback) //<<<<<<<<<<< defines the callback to be called
.build();
}
}
//<<<<<<<<<< The callback
private RoomDatabase.Callback dbCallback = new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
//.......... code here to do anything required when the database is created ..........//
}
@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
//.......... code here to do anything required when the database is opened ..........//
}
@Override
public void onDestructiveMigration(@NonNull SupportSQLiteDatabase db) {
super.onDestructiveMigration(db);
//.......... code here to do anything required when the database has effectively been recreated (tables would have been built) ..........//
}
};
https://stackoverflow.com/questions/58245268
复制相似问题