我正在设计一个数据库,该数据库将在使用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?是否有关于选择一种类型而不是另一种类型的最佳实践?
答案 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)。