java - 删除旧表并创建新表并预填充它 - RoomDatabase
问题描述
我正在使用java在 android studio 中创建一个简单的 android 应用程序。我有一个 roomdatabase db,其中有一个名为 user 的表,它有四列 名称、职业、年龄、描述,并且我已经使用我在 sqlite studio 中制作的数据库进行了预填充。
现在,我想在表上添加一个列姓氏,但我想删除所有预填充的数据并使用一个包含姓氏的新数据库再次预填充该表。
起初我想使用自动迁移并添加一个新列。但我不知道如何删除所有现有数据并再次预填充数据库。
我想删除现有数据,因为我想更改列描述中存在的所有信息。与列名一样,现在它包含全名,在某些情况下写成行“name surname”,其他时候写成“surname name”,例如“Will Smith”“Smith Will”。现在我想在单独的列名称和姓氏中有姓名和姓氏
有人可以推荐我一些东西吗?先感谢您
解决方案
AutoMigration 无法处理修改数据本身。因此,您将不得不手动执行此操作,从而使用破坏性迁移。
这是一个例子(可以看出实际进行)
请注意,这假设没有为原始预填充数据库分配版本或版本 1,并且版本 1 用于传递给 @Database 注释的版本。
SQLite 数据库作为其标头的一部分,有一个 user_version 号(偏移 60 表示 4 个字节)。它将这与传递给 Room 的版本进行比较,以确定迁移/自动迁移。正如所见,如果迁移,改变这一点至关重要。
如果进行开发,您可以通过更改数据库和应用程序并卸载应用程序来从更改的数据库开始。无需玩版本号。
- 通过添加新的 surname 列来修改 User 类。例如
:-
@Entity
class User {
@PrimaryKey
@NonNull
String name;
String profession;
int age;
String description;
/* ADDED FOR V2 */
String surname;
}
编译 (Ctrl + F9),然后从 Android View 找到生成的 Java,然后找到与 @Database 类相同但后缀为 _Impl 的类。
- 找到createAllTables方法,然后是 User 表的 SQL。记下 SQL 和新列的定义,例如 -surname TEXT
在 SQLite Studio 中,运行以下 SQL:-
ALTER TABLE user ADD COLUMN surname TEXT;
COLUMN 关键字后面的文本/代码与上述 SQL 完全相同(您可以在列名周围包含或省略封闭的 `,它们不容易显示在 SO)查看数据,例如,现在将是:-
- 请注意,姓氏列填充了空值。
相应地编辑数据。例如:-
然后运行以下 SQL
PRAGMA user_version;
(检查当前版本)然后运行以下SQL
PRAGMA user_version = 2;
(更改版本(猜测2))然后运行以下SQL
PRAGMA user_version;
(检查版本现在是2)退出 SQLite Studio
用新数据库替换项目中的文件/资产。例如:-
在@Database 类(不是生成的java)中:-
- 将数据库版本更改为 2
- 将以下内容添加到 databaseBuild 中:-
- 如果从
.fallbackToDestructiveMigrationFrom(1)
1 到 2 - 或
.fallbackToDestructiveMigration()
(不那么安全,但更包容)
- 如果从
运行应用程序,例如:-
推荐阅读
- c++ - 用于从可能不存在的容器中检索对象的 API 设计
- java - Wildfly 13:无法在 url 的查询字符串中使用 {} []
- postgresql - PotgreSQL-错误:编码“UTF8”的字节序列无效:0xeb 0x6e 0x74
- fiware-orion - 上下文消费者可以通过 Orion 检索实体的历史值吗?
- php - 如何使用相同的代码库为多租户管理 Laravel 文件缓存
- android - 用户 10085 和当前进程都没有 android.permission.READ_PHONE_STATE
- docker - Docker 构建失败:“无法满足的约束”
- button - 使用 netsuite 添加按钮和更新销售订单
- elasticsearch - elasticsearch:单个索引中的多种类型
- kubernetes - Master - Kubernetes 中的工作节点通信