【问题标题】:How can (or should) I map `BaseColumns._ID` to `ROWID`, `_ROWID_`, or `OID`?我如何(或应该)将 `BaseColumns._ID` 映射到 `ROWID`、`_ROWID_` 或 `OID`?
【发布时间】: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这个额外字段。

标签: android database sqlite


【解决方案1】:

rowids 可能会在内部维护,但它们可以更改,例如在做VACUUM时。

为确保您拥有稳定的 ID,您应该显式声明一个 INTEGER PRIMARY 列,然后您可以只使用名称 _id

【讨论】:

  • 根据文档:“如果表包含 INTEGER PRIMARY KEY 类型的列,则该列将成为 ROWID 的别名。然后您可以使用四个不同名称中的任何一个来访问 ROWID,上面描述的原始三个名称或赋予 INTEGER PRIMARY KEY 列的名称。所有这些名称都是彼此的别名,并且在任何情况下都同样适用。换句话说,显式声明一个 INTEGER PRIMARY 列与不这样做是一样的。
  • 您阅读了我链接的页面吗? "VACUUM 命令可以更改任何没有显式 INTEGER PRIMARY KEY 的表中条目的 ROWID。"
  • 是的,但是根据我粘贴的引用,INTEGER PRIMARY KEY 是 ROWID 的别名,这意味着 VACUUM 也会改变它。
  • 它可能是一个别名,但它是显式
  • INTEGER PRIMARY KEY 列中的行 ID 不会更改。如果没有 INTEGER PRIMARY KEY,它们可以更改。
【解决方案2】:

别名只是列的另一个名称,它不会复制任何数据。

这意味着在 Sqlite 中使用 INTEGER PRIMARY KEY 创建一个“_id”列不会复制任何数据,因为这将被“映射”到 rowid(即,将是一个别名)。

“_id”别名和常规别名之间至少有一个区别(正如 CL. 所指出的,引用 Sqlite 文档):“VACUUM 命令可能会更改任何没有显式 INTEGER PRIMARY KEY 的表。”。因此,使用 INTEGER PRIMARY KEY 创建一个“_id”列将防止该列被 VACUUM 命令更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 2017-08-31
    • 2014-04-28
    • 1970-01-01
    • 2011-05-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多