首页 > 解决方案 > 删除旧表并创建新表并预填充它 - RoomDatabase

问题描述

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

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

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

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

有人可以推荐我一些东西吗?先感谢您

标签: javaandroid-studioandroid-sqliteandroid-roomandroid-room-relation

解决方案


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 和新列的定义,例如 -surname TEXT
  2. 在 SQLite Studio 中,运行以下 SQL:- ALTER TABLE user ADD COLUMN surname TEXT;COLUMN 关键字后面的文本/代码与上述 SQL 完全相同(您可以在列名周围包含或省略封闭的 `,它们不容易显示在 SO

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

    1. 在此处输入图像描述
  • 请注意,姓氏列填充了空值。
  1. 相应地编辑数据。例如:-

    1. 在此处输入图像描述
  2. 然后运行以下 SQL PRAGMA user_version;(检查当前版本)

  3. 然后运行以下SQL PRAGMA user_version = 2;(更改版本(猜测2))

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

  5. 退出 SQLite Studio

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

    1. 在此处输入图像描述
  7. 在@Database 类(不是生成的java)中:-

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

    1. 在此处输入图像描述

推荐阅读