在Kotlin data class(Room实体)中如何将保留关键字设为列名?
解决方案
核心问题:你当前用反引号包裹abstract仅解决了Kotlin语法层面的保留关键字冲突,但是Room生成SQL语句时会默认将字段名作为列名,而abstract同时也是SQL的保留关键字,直接生成的SQL会触发语法错误。
方案1:指定自定义列名(最推荐)
给字段加@ColumnInfo注解指定非关键字的列名,既避免SQL关键字冲突,也不影响Kotlin代码中字段的使用,修改后的对应字段代码如下:
@ColumnInfo(name = "article_abstract") // 自定义数据库列名,避开保留字 val `abstract`: String?="",
这种方式下,Kotlin代码中仍然用article.abstract``访问字段,数据库实际存储的列名为article_abstract,完全规避所有关键字冲突问题。
方案2:强制使用abstract作为列名
如果业务要求必须保留abstract作为数据库列名,可在@ColumnInfo的name属性中给列名包裹反引号,让SQL引擎识别为列名而非关键字:
@ColumnInfo(name = "`abstract`") // 给列名加反引号,告知SQL这是字段名 val `abstract`: String?="",
也可以用双引号包裹,SQLite同样支持:
@ColumnInfo(name = "\"abstract\"")
补充说明
所有Kotlin保留关键字用作Room实体字段名时,都可以用以上两种方式解决存储冲突,优先选择方案1,自定义列名可读性更强,后续写SQL查询、维护表结构时不需要额外处理关键字兼容问题。
内容的提问来源于stack exchange,提问作者DroidBee
相关产品推荐
相关产品推荐

