我正在使用BaseColumns
在Android上使用sqlite创建数据库。
这个类带有一个最终变量_ID = "_id";
,以便(我认为)标准化行id SO answer about this列的名称。但是sqlite通常不需要这个,因为它在内部维护一个行ID,可以通过名称ROWID
,_ROWID_
或OID
访问任何其他列。
对我来说,将BaseColumns._ID
映射到其中一个虚拟列似乎是合乎逻辑的,但由于它是最终变量,我看不到直接的方法。
我如何(或应该)将BaseColumns._ID
映射到ROWID
,_ROWID_
或OID
?
编辑:根据sqlite文档:
“如果一个表包含一个INTEGER PRIMARY KEY类型的列,那么该列将成为ROWID的别名。然后,您可以使用四个不同的名称中的任何一个访问ROWID,上面描述的原始三个名称或给出的名称INTEGER PRIMARY KEY列。所有这些名称都是彼此的别名,在任何情况下都能同样有效。“
因此,明确声明INTEGER PRIMARY列将是重复。
答案 0 :(得分:1)
rowid
可以在内部维护,但它们可以更改,例如在做VACUUM时。
为确保您拥有稳定的ID,您应该显式声明一个INTEGER PRIMARY列 - 然后您只需使用名称_id
即可。
答案 1 :(得分:0)
别名只是列的另一个名称,它不会复制任何数据。
这意味着在Sqlite中使用INTEGER PRIMARY KEY创建“_id”列不会复制任何数据,因为这将被“映射”到rowid(即,将是别名)。
“_id”别名和常规别名之间至少有一个差异(如CL所述,引用Sqlite文档):“VACUUM命令可能会更改条目的ROWID任何没有显式INTEGER PRIMARY KEY的表。“因此,使用INTEGER PRIMARY KEY创建“_id”列将阻止使用VACUUM命令更改此列。