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?是否有关于选择一种类型而不是另一种类型的最佳实践?
两者都很好。在移动设备上(通常大部分时间) Int应该足够了(它还可以为您节省 4 个字节Long)。
为什么?使用一个Int你可以存储超过 20 亿条记录 (2_000_000_000)。因此,您可以存储1/4生活在地球上的所有人类的记录。仅供比较:使用 aLong将使您能够存储超过 900 千万条记录 (900_000_000_000_000_000)。
这两种类型都将映射到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个字节中。
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |