【发布时间】:2015-08-07 18:30:57
【问题描述】:
我正在使用BaseColumns 在 Android 上使用 sqlite 创建数据库。
这个类带有一个最终变量_ID = "_id";(我认为)标准化行IDSO 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 列将是重复的。
【问题讨论】:
-
android 需要一个
_id列用于光标适配器和其他一些东西。您不需要将它映射到任何东西,只需将其用作主键,它就会自动别名。你没有什么可做的。 (通常是CREATE TABLE foo (_id INTEGER PRIMARY KEY, bar TEXT);) -
如果您的表格不包含
_id字段,您可以使用SELECT rowID AS _id, ...即可。 -
@DerGol...lum,关键是根据 sqlite 文档,显式声明 INTEGER PRIMARY 列是 rowid 的别名(请参阅对 CL. 答案的评论中的引用)。所以我会复制列。
-
@DerGol...lum,当然可以。这里的重点是它复制了该列。我会有 _ID 和 ROWID。为什么要这样做?
-
RowID 由 SQLite 自动插入。那我不明白你为什么要添加
_id这个额外字段。