删除旧的 table 并创建新的并预填充它 - RoomDatabase

Delete old table and create new one and prepopulate it - RoomDatabase

我正在使用 java 在 android studio 中创建一个简单的 android 应用程序。 我有一个带有 table 命名用户的房间数据库数据库,该用户具有 四列 姓名、职业、年龄、描述并且我已经使用我在 sqlite studio 中创建的数据库进行了预填充。

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

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

我想删除现有数据,因为我想更改列 描述 中存在的所有信息。同样与列 name 一样,现在它包含全名,在某些情况下写成行“name surname”,其他时候像“surname name” e.x “Will Smith” “史密斯威尔”。现在我想在单独的列 namesurname

中有名字和姓氏

有人可以推荐给我一些东西吗?提前谢谢你

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

下面举个例子(可以看出是实际进行的)

  • 请注意,这假设没有版本或版本 1 分配给原始 pre-populated 数据库,并且 1 用于传递给 @Database 注释的版本。

    • 一个 SQLite 数据库有一个 header 的一部分,一个 user_version 数字(偏移 60 为 4 个字节)。它将此与传递给确定 migration/auto 迁移的 Room 的版本进行比较。正如所看到的那样,如果迁移,改变这一点是至关重要的。

    • 如果开发,您可以通过更改数据库和应用程序并卸载应用程序,从更改后的数据库开始。不用玩版本号了。

  1. 通过添加新的姓氏列修改用户 class。例如

:-

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

    1. 找到 createAllTables 方法,然后找到用户 table 的 SQL 方法。记下 SQL 和新列的定义,例如-姓氏文本
  2. 在SQLite Studio中,运行以下SQL:- ALTER TABLE user ADD COLUMN surname TEXT;其中COLUMN关键字后的text/code完全按照上面提到的 SQL(您可以在列名称周围包含或省略封闭的 `,它们不容易在 SO 中显示)

  3. 查看数据现在是:-

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

  2. 然后运行下面的SQLPRAGMA user_version;(查看当前版本)

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

  4. 然后运行下面的SQLPRAGMA user_version;(检查现在版本是2)

  5. 退出 SQLite Studio

  6. 用新数据库替换项目中的file/asset。例如:-

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

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