我如何(或应该)将`BaseColumns._ID`映射到`ROWID`,`_ROWID_`或`OID`?

时间:2015-07-14 17:04:05

标签: android database sqlite

我正在使用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列将是重复。

2 个答案:

答案 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命令更改此列。