栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如果仅添加新表,则迁移会议室数据库

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如果仅添加新表,则迁移会议室数据库

确实 具备良好的迁移系统,至少直到

2.1.0-alpha03

因此,在我们拥有更好的迁移系统之前,有一些变通办法可以在会议室中轻松进行迁移。

由于不存在这样的方法,

@Database(createNewTables = true)

或者
MigrationSystem.createTable(User::class)
,它应该有一个或另一个,唯一可能的方法是在运行

CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))

在您的

migrate
方法中。

val MIGRATION_1_2 = object : Migration(1, 2){    override fun migrate(database: SupportSQLiteDatabase) {        database.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))")    }}

为了获得以上 SQL 脚本,您有四种方法

1.自己写

基本上,您必须编写与Room生成的脚本匹配的上述脚本。这种方式是可行的,是不可行的。(考虑您有50个字段)

2.导出模式

如果您

exportSchema = true
@Database
批注中加入,Room将在项目文件夹的/ schemas中生成数据库架构。用法是

@Database(entities = [User::class], version = 2, exportSchema = true)abstract class AppDatabase : RoomDatabase {   //...}

确保您已在

build.grade
应用模块中包含以下行

kapt {    arguments {        arg("room.schemaLocation", "$projectDir/schemas".toString())    }}

当您运行或构建项目时,您将获得一个JSON文件

2.json
,其中包含Room数据库中的所有查询。

  "formatVersion": 1,  "database": {    "version": 2,    "identityHash": "325bd539353db508c5248423a1c88c03",    "entities": [      {        "tableName": "User",        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))",        "fields": [          { "fieldPath": "id", "columnName": "id", "affinity": "INTEGER", "notNull": true          },

因此,您可以

createSql
在您的
migrate
方法中包括以上内容。

3.从AppDatabase_Impl获取查询

如果您不想导出架构,则仍然可以通过运行或构建将生成

AppDatabase_Impl.java
文件的项目来获取查询。并在指定文件内。

@Overridepublic void createAllTables(SupportSQLiteDatabase _db) {  _db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");

createAllTables
方法内,将存在所有实体的创建脚本。您可以获取它并将其包含在您的
migrate
方法中。

4.注释处理。

您可能会猜到,Room会在编译时间内并使用您添加的Annotation Processing
生成上述所有文件

schema
AppDatabase_Impl
文件。

kapt "androidx.room:room-compiler:$room_version"

这意味着您也可以这样做,并创建自己的注释处理库,该库将为您生成所有必要的创建查询。

这个想法是为

@Entity
和的房间注释创建一个注释处理库
@Database
。以带有注释的类
@Entity
为例。这些是您必须遵循的步骤

  1. 新建
    StringBuilder
    并追加“如果不存在则创建表”
  2. class.simplename
    或按的
    tableName
    字段获取表名称
    @Entity
    。将其添加到您的
    StringBuilder
  3. 然后为类的每个字段创建SQL列。通过字段本身或
    @ColumnInfo
    注释来获取字段的名称,类型和可空性。对于每个字段,您都必须在中添加
    id INTEGER NOT NULL
    列的样式
    StringBuilder
  4. 通过添加主键
    @PrimaryKey
  5. 添加
    ForeignKey
    Indices
    如果存在。
  6. 完成后,将其转换为字符串并将其保存在您要使用的一些新类中。例如,将其保存如下

    public final class UserSqlUtils {
    public String createTable = “CREATE TABLE IF NOT EXISTS User (id INTEGER, PRIMARY KEY(id))”;
    }

然后,您可以将其用作

val MIGRATION_1_2 = object : Migration(1, 2){    override fun migrate(database: SupportSQLiteDatabase) {        database.execSQL(UserSqlUtils().createTable)    }}

我为自己创建了一个这样的库,您可以检出它,甚至可以在您的项目中使用它。请注意,我制作的库并不完整,只满足我创建表的要求。

RoomExtension可实现更好的迁移

使用RoomExtension的应用程序

希望它有用。

更新

在撰写此答案时,会议室版本已定

2.1.0-alpha03
,当我向开发人员发送电子邮件时,得到了答复

预计在

2.2.0

不幸的是,我们仍然缺乏更好的迁移系统。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496496.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号