【问题标题】:Delete old table and create new one and prepopulate it - RoomDatabase删除旧表并创建新表并预填充它 - RoomDatabase
【发布时间】:2021-10-06 22:07:47
【问题描述】:

我正在使用 java 在 android studio 中创建一个简单的 android 应用程序。 我有一个带有 四列 的名为 user 的表的 roomdatabase db 姓名、职业、年龄、描述,我已经使用我在 sqlite studio 中制作的数据库进行了预填充。

现在,我想在表格上添加一列 surname,但我想删除所有预填充的数据,并使用一个新数据库再次预填充表格,该数据库还包含姓氏。

起初我想使用 自动迁移 并添加一个新列。但我不知道如何删除所有现有数据并再次预填充数据库。

我想删除现有数据,因为我想更改 description 列中存在的所有信息。与列 name 一样,现在它包含全名,在某些情况下写成行“name surname”,而其他时候则写成“surname name”,例如“Will Smith”“Smith Will”。现在我想将姓名和姓氏分别放在 namesurname

列中

有人可以推荐我吗?提前谢谢你

【问题讨论】:

  • 为什么要删除数据?是否有比预填充版本更多的行?目标是基本上只添加姓氏吗?关于为什么会影响您选择的路径的推理。也许编辑您的问题以详细说明。
  • 你好@MikeT 我更新了我的解释。我想更新/删除所有数据,因为我需要在“描述”列和“名称”列中进行更改

标签: java android-studio android-sqlite android-room android-room-relation


【解决方案1】:

AutoMigration 无法处理修改数据本身。因此,您将不得不手动执行此操作,从而使用破坏性迁移。

这是一个例子(可以看到实际进行)

  • 请注意,这假定没有为原始预填充数据库分配版本或版本 1,并且版本 1 用于传递给 @Database 注释的版本。

    • 一个 SQLite 数据库作为其头部的一部分,有一个 user_version 号(偏移 60 表示 4 个字节)。它将这与传递给 Room 的版本进行比较,以确定迁移/自动迁移。正如所见,如果迁移,改变这一点至关重要。

    • 如果进行开发,您可以从更改的数据库开始,对数据库和应用程序进行更改并卸载应用程序。无需玩版本号。

  1. 通过添加新的 surname 列来修改 User 类。例如

:-

@Entity
class User {
    @PrimaryKey
    @NonNull
    String name;
    String profession;
    int age;
    String description;
    /* ADDED FOR V2 */
    String surname;
}
  1. 编译 (Ctrl + F9),然后从 Android View 中找到生成的 Java,然后找到与 @Database 类相同但后缀为 _Impl 的类。

    1. 找到 createAllTables 方法,然后找到 User 表的 SQL。记下 SQL 和新列的定义,例如-姓氏文本
  2. 在 SQLite Studio 中,运行以下 SQL:-ALTER TABLE user ADD COLUMN surname TEXT;,其中 COLUMN 关键字后的文本/代码与上述 SQL 完全相同(您可以在列名周围包含或省略封闭的 `, 它们不容易在 SO 中显示

  3. 查看数据,例如现在将是:-

  • 请注意,surname 列中填充了空值。
  1. 相应地编辑数据。例如:-

  2. 然后运行以下 SQL PRAGMA user_version;(检查当前版本)

  3. 然后运行以下SQLPRAGMA user_version = 2;(改版本(猜2))

  4. 然后运行以下 SQL PRAGMA user_version;(检查版本现在是 2)

  5. 退出 SQLite Studio

  6. 用新数据库替换项目中的文件/资产。例如:-

  7. 在@Database 类中(不是生成的java):-

    1. 将数据库版本更改为 2
    2. 将以下内容添加到数据库构建中:-
      1. .fallbackToDestructiveMigrationFrom(1),如果从 1 到 2
      2. .fallbackToDestructiveMigration()(不那么安全,但更全面)
  8. 运行应用程序,例如:-

【讨论】:

  • 非常感谢,在您的帮助下我搞定了。你在我的两个问题上帮助了我。你的回答很详细,很懂。再次感谢您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 2018-01-05
相关资源
最近更新 更多