我有一个数据类:
data class User(
val name:String,
val age: Int
)我用这个在数据库中保存用户的数据,现在的问题是我想要添加一个新的字段。
val gender: String如果我加上这个,应用程序会在从数据库中检索用户数据时崩溃,因为它不再是相同的数据了。
这是我从数据库中检索数据的代码:
@Query("SELECT*FROM users WHERE name =:name")
suspend fun getUser(name:String):Flow<User>如果可能的话,我最感兴趣的是看到一个伪码解决方案。
发布于 2021-08-30 12:13:37
您需要对数据库进行迁移。您可以在那里找到所有的操作说明,迁移室数据库。
如果您的房间版本是2.4.0-alpha 01或更高:
在数据库中替换:
@Database(
version = 1,
entities = {User.class}
)通过以下方式:
@Database(
version = 2,
entities = {User.class},
autoMigrations = {
@AutoMigration (from = 1, to = 2)
}
),否则您将需要手动执行迁移:
将其添加到数据库类中:
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE users "
+ " ADD COLUMN gender TEXT");
}
};并将.addMigrations(MIGRATION_1_2)添加到Room.databaseBuilder()中
发布于 2021-08-30 12:16:59
你有两个解决方案,一个是正确的,另一个是快速的:
正确的一个:
@Database(
version = 2,
entities = [User::class],
autoMigrations = [
AutoMigration (from = 1, to = 2)
]
)代码摘自:https://developer.android.com/training/data-storage/room/migrating-db-versions#automated
这是一种迁移,因为在这种情况下,您只是向表中添加一个列,您可以尝试这种方法,它很可能会工作。如果没有,那么您必须使用一些SQL代码实现自己的迁移。
快的那个:
在创建数据库的地方,添加以下方法:.fallbackToDestructiveMigration()。这将使您在需要更改数据库版本和迁移时,而不是在不需要迁移的情况下,只删除旧数据库并重新创建它。考虑到这个解决方案会在此之前删除您保存的所有信息,因此,只有在您匆忙使用并且不关心在更新之间维护数据时,才尝试使用它。
https://stackoverflow.com/questions/68983666
复制相似问题