是否可以在 Android Room 中使用 String 作为 PrimaryKey

Posted

技术标签:

【中文标题】是否可以在 Android Room 中使用 String 作为 PrimaryKey【英文标题】:Is it possible using String as PrimaryKey in Android Room 【发布时间】:2018-05-18 20:29:03 【问题描述】:

我在我的 java 后端服务器中使用 uuid。所以我需要在房间 android 中使用该 uuid 来确保实体正确同步。 我知道Is it possible to apply primary key on the text fields in android database 和text as primarykey in android。我想创造这样的东西

@Entity(tableName = CrewColumns.TABLE_NAME)
@TypeConverters(BigDecimalConverter::class)
@JsonIgnoreProperties(ignoreUnknown = true)
class Crew() 
    constructor (uuid: String) : this() 
        this.uuid = uuid;
    

    /**
     * The unique ID of the item.
     */
    @PrimaryKey
    @ColumnInfo(name = CrewColumns.UUID)
    var uuid: String = ""
    @ColumnInfo(name = CrewColumns.NAME)
    var name: String = ""

Room(DAO 等)会有问题吗?谢谢。

【问题讨论】:

您当然可以使用字符串作为主键。您在尝试时遇到了什么具体问题? @CommonsWare 目前没有。 【参考方案1】:

是的,您可以将String 用作@PrimaryKey

此外,我还建议使用 Kotlin 的 data class 来简化您的实体。例如:

@Entity
data class Crew(@PrimaryKey val uuid: String, val name: String) 
    // Put any functions or other members not initialized by the constructor here

【讨论】:

@juanmeanwhile kotlin 怎么样?我们是否也必须注释 NonNull 吗? @mochadwi 不需要,因为该语言已经有一种方法可以指示字符串不可为空。 如果执行插入并且主键是String类型,返回类型是什么,它也可以是String类型吗?喜欢,在下面显示? @Insert(onConflict = OnConflictStrategy.REPLACE) Single 插入(船员);

以上是关于是否可以在 Android Room 中使用 String 作为 PrimaryKey的主要内容,如果未能解决你的问题,请参考以下文章

Android Room:@Ignore vs Transient

使用 Android ORM Room 的最佳方式?

Android Room 加入的返回类型

将 TypeConverters 应用到 Dao Android Room

android Room 数据库存储敏感数据是不是安全?

GeoPoint 不允许存储在 Room 中