当前位置: 首页 > 知识库问答 >
问题:

在房间中创建表格的方法[副本]

籍利
2023-03-14
room.createTable(User::class)

类似的方法例如存在于OrmLite中

TableUtils.createTable(connectionSource, User::class.java)

这种必要性来自于用简单的SQLite查询创建表的复杂性。目前,您可以做的是在migrate中编写您的create SQLite脚本

db.execSQL("CREATE TABLE IF NOT EXIST `User` (uid INTEGER NON NULL, PRYMARY KEY (`uid`))")

上面的方法没有问题,但是如果您有50个字段(例如),它会得到复杂且长的SQLite脚本。很明显,你不是自己写的,有两种方法来获得Room为你自动生成的Create脚本以便你只是复制过去。

    null

因此,我希望在迁移时创建表的方法是面向对象的。我能想到的唯一方法显然是使用模型数据类并根据模型的每个字段生成查询。应该是这样的

fun createTable(db: SupportSQLiteDatabase, clazz: KClass<*>) {
    val fields = extractColumns(clazz)
    val primaryKeys = fields
            .filter { it.primaryKey }
            .map { it.name }

    val createQuery = "CREATE TABLE IF NOT EXISTS `${clazz.simpleName}` (" +
            fields.joinToString(", ") { "`${it.name}` ${it.type} ${it.nonNull}" } +
            ", PRIMARY KEY (" + primaryKeys.joinToString(",") { "`$it`" } +
            "))"
    db.execSQL(createQuery)
}

fun extractColumns(clazz: KClass<*>): Array<Column>{
    val columns = ArrayList<Column>()
    for (field in clazz.declaredMemberProperties){
        val name = field.findAnnotation<ColumnInfo>()?.name ?: field.name
        val type = getSqlType(field.returnType)
        val nonNull = if (field.returnType.isMarkedNullable) "" else "NON NULL"
        val primaryKey = field.findAnnotation<PrimaryKey>() != null
        columns.add(Column(name, type, nonNull, primaryKey))
    }
    return columns.toTypedArray()
}

但问题是,房间注释都是用@retention(retentionpolicy.class)注释的,它只能在编译期间访问。它们在运行时不可用。因此我的所有findanNotation方法都将返回null。我想在编译期间进行创建,但想不出该怎么做。

那么,我的问题是,有没有任何方法可以在编译期间生成CREATE脚本,如果有的话,该怎么做呢?

共有1个答案

祁雪峰
2023-03-14

room的当前更新中,实际上存在使用Annotation Processing创建SQL查询的方法。使用注释处理,您必须编写小型库,以便在构建时为您生成room查询。

创建注释处理库并不简单,下面是相关问题。

仅添加新表时的Room数据库迁移

 类似资料:
  • 问题内容: 我想请你帮忙。我在socket.io的客户端上遇到了麻烦,我想在客户端调用此代码以在socket.io中创建一个房间: 我不知道这是否正确,如果不正确,请帮助我纠正这些家伙。我不是在节点js和套接字方面专业,但我已经阅读了他们的wiki。有没有可能创造空间的方法? 问题答案: 不需要创建Socket.IO中的房间,而是在套接字加入时创建一个房间。它们是在服务器端加入的,因此您必须指示服

  • 我有一个 postgresql 数据库的 spring r2dbc 连接,并想创建一个表, 实际上等同于 SQL 由于DatabaseClient似乎只支持select/insert,我如何做到这一点?

  • 我想列个这样的单子。请帮帮我.谢了。

  • 找到:TableInfo{name='news',Columns={alias=Column{name='alias',Type='text',affinity='2',notnull=false,PrimaryKeyPosition=0,DefaultValue='null'},Selected=Column{name='select',Type='integer',affinity='3',n

  • 我正在使用Room作为应用程序的数据库。我正在用改型从服务器上获取数据。场景是,我有一个名为Photo的类,并用实体进行注释,以供room使用,我使用这个类使用retroft映射API的响应。我需要使用同一个类创建两个表,例如:最新的照片表和流行的照片表。我怎样才能做到这一点。 > 我不想创建一个新的类并使它从另一个类扩展 我有一个想法,通过插入一个新的列,表明照片是流行的或最新的,但我不知道如何

  • 本文向大家介绍如何在C#中创建Hashtable的浅表副本?,包括了如何在C#中创建Hashtable的浅表副本?的使用技巧和注意事项,需要的朋友参考一下 要创建Hashtable的浅表副本,代码如下- 示例 输出结果 这将产生以下输出- 示例 让我们看另一个例子- 输出结果 这将产生以下输出-