Room中的主键应该是Int还是Long?

时间:2019-05-05 17:46:14

标签: android database kotlin

我正在设计一个数据库,该数据库将在使用Room的Android中实现,在阅读了文档之后,我发现使用Int或Long作为主键没有任何建议。

在某些地方,他们用int主键定义实体:

@Entity
data class User(
    @PrimaryKey var id: Int,
    var firstName: String?,
    var lastName: String?
)

但是在其他地方,它表示如果要获取插入的最后一行的ID,请使用long方法。

@Dao
interface MyDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertUsers(vararg users: User)

    @Insert
    fun insertBothUsers(user1: User, user2: User)

    @Insert
    fun insertUsersAndFriends(user: User, friends: List<User>)
}
  

如果@Insert方法仅接收1个参数,则它可以返回long,这是插入项的新rowId。如果参数是数组或集合,则应返回long []或List。

因此,房间的主键应该是Int还是Long?是否有关于选择一种类型而不是另一种类型的最佳实践?

2 个答案:

答案 0 :(得分:4)

这两种类型都将映射到基础SQLite数据库中的INTEGER

例如,使用这样的类:

@Entity
data class Test(@PrimaryKey val i: Int, val l: Long)

您将获得与此查询一起定义的SQLite表:

CREATE TABLE IF NOT EXISTS `Test` (`i` INTEGER NOT NULL, `l` INTEGER NOT NULL, PRIMARY KEY(`i`))

因此,您可以使用代码中所需大小的任何一种。如果您出于某种原因决定使用Int并且用完了值,甚至可以将其更改为Long,而不必稍后再迁移数据库。

对于这种INTEGER类型,根据SQLite documentation

  

该值为带符号整数,根据值的大小存储在1、2、3、4、6或8个字节中。

答案 1 :(得分:1)

都很好。在移动设备上(通常是大多数时间),Int就足够了(与Long相比,它还能为您节省4个字节)。

为什么??使用Int,您可以存储超过20亿条记录(2_000_000_000)。因此,您可以存储大约1/4个地球上所有人类的记录。只是为了比较:使用Long将使您能够存储900多个四千万条记录(900_000_000_000_000_000_000)。

相关问题