首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Kotlin中向数据类添加新字段时如何处理更改

在Kotlin中向数据类添加新字段时如何处理更改
EN

Stack Overflow用户
提问于 2021-08-30 11:51:25
回答 2查看 330关注 0票数 0

我有一个数据类:

代码语言:javascript
运行
复制
data class User(
  val name:String,
  val age: Int
)

我用这个在数据库中保存用户的数据,现在的问题是我想要添加一个新的字段。

代码语言:javascript
运行
复制
val gender: String

如果我加上这个,应用程序会在从数据库中检索用户数据时崩溃,因为它不再是相同的数据了。

这是我从数据库中检索数据的代码:

代码语言:javascript
运行
复制
@Query("SELECT*FROM users WHERE name =:name")
suspend fun getUser(name:String):Flow<User>

如果可能的话,我最感兴趣的是看到一个伪码解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-30 12:13:37

您需要对数据库进行迁移。您可以在那里找到所有的操作说明,迁移室数据库

如果您的房间版本是2.4.0-alpha 01或更高:

在数据库中替换:

代码语言:javascript
运行
复制
@Database(
  version = 1,
  entities = {User.class}
)

通过以下方式:

代码语言:javascript
运行
复制
@Database(
  version = 2,
  entities = {User.class},
  autoMigrations = {
    @AutoMigration (from = 1, to = 2)
  }
)

,否则您将需要手动执行迁移:

将其添加到数据库类中:

代码语言:javascript
运行
复制
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()

票数 0
EN

Stack Overflow用户

发布于 2021-08-30 12:16:59

你有两个解决方案,一个是正确的,另一个是快速的:

正确的一个:

代码语言:javascript
运行
复制
@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()。这将使您在需要更改数据库版本和迁移时,而不是在不需要迁移的情况下,只删除旧数据库并重新创建它。考虑到这个解决方案会在此之前删除您保存的所有信息,因此,只有在您匆忙使用并且不关心在更新之间维护数据时,才尝试使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68983666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档