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

Edu*_*ona 1 database android kotlin

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

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

@Entity
data class User(
    @PrimaryKey var id: Int,
    var firstName: String?,
    var lastName: String?
)
Run Code Online (Sandbox Code Playgroud)

但是在其他地方,它表示如果要获取插入的最后一行的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>)
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ren*_*ari 7

两者都很好。在移动设备上(通常大部分时间) Int应该足够了(它还可以为您节省 4 个字节Long)。

为什么?使用一个Int你可以存储超过 20 亿条记录 (2_000_000_000)。因此,您可以存储1/4生活在地球上的所有人类的记录。仅供比较:使用 aLong将使您能够存储超过 900 千万条记录 (900_000_000_000_000_000)。


zsm*_*b13 6

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

例如,使用这样的类:

@Entity
data class Test(@PrimaryKey val i: Int, val l: Long)
Run Code Online (Sandbox Code Playgroud)

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

CREATE TABLE IF NOT EXISTS `Test` (`i` INTEGER NOT NULL, `l` INTEGER NOT NULL, PRIMARY KEY(`i`))
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用代码中需要量级的任何一种。如果确实Int由于某种原因决定使用an ,并且用完了值,那么甚至可以将其更改为a,Long而不必稍后再迁移数据库。

对于这种INTEGER类型,根据SQLite文档

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