Android 如何(或应该)将'BaseColumns.'u ID'映射到'ROWID'、'u ROWID'或'OID`?

Android 如何(或应该)将'BaseColumns.'u ID'映射到'ROWID'、'u ROWID'或'OID`?,android,database,sqlite,Android,Database,Sqlite,我正在使用BaseColumns在Android上创建一个带有sqlite的数据库。 这个类附带了最后一个变量\u ID=“\u ID”以(我认为)标准化行id列的名称。但是,sqlite通常不需要这样做,因为它在内部维护一个行id,可以通过名称ROWID、\urowid\uu或OID访问该行id 对我来说,将BaseColumns.\u ID映射到其中一个虚拟列似乎是合乎逻辑的,但是由于它是最后一个变量,我看不到一种简单的方法 如何(或应该)将基本列映射到行ID、行ID、或OID 编辑:根据s

我正在使用
BaseColumns
在Android上创建一个带有sqlite的数据库。 这个类附带了最后一个变量
\u ID=“\u ID”以(我认为)标准化行id列的名称。但是,sqlite通常不需要这样做,因为它在内部维护一个行id,可以通过名称
ROWID
\urowid\uu
OID
访问该行id

对我来说,将
BaseColumns.\u ID
映射到其中一个虚拟列似乎是合乎逻辑的,但是由于它是最后一个变量,我看不到一种简单的方法

如何(或应该)将
基本列映射到
行ID
行ID
、或
OID

编辑:根据sqlite文档:

如果表包含INTEGER主键类型的列,则该列将成为ROWID的别名。然后,您可以使用四个不同的名称中的任意一个来访问ROWID,即上面描述的三个原始名称或指定给INTEGER主键列的名称。所有这些名称都是彼此的别名,在任何上下文中都同样适用。”


因此,显式声明一个整数主列将是一个重复。

可以在内部维护
rowid
s,但它们可以更改,例如在执行时


为了确保您有稳定的id,您应该显式声明一个整数主列,然后您可以使用名称
\u id

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

这意味着在Sqlite中创建带有整数主键的“_id”列不会复制任何数据,因为这将“映射”到rowid(即,将是一个别名)


“\u id”别名和常规别名之间至少有一个区别(正如CL引用Sqlite文档所指出的):“VACUUM命令可以更改任何表中没有显式整数主键的项的rowid。”。因此创建“\u id”“带有整型主键的列将防止使用真空命令更改此列。

android需要一个
\u id
列作为光标适配器和其他一些东西。您不需要将它映射到任何东西,只需将它用作主键,它就会自动被别名。你无事可做。(通常
创建表foo(_idinteger PRIMARY KEY,bar TEXT);
)如果您的表不包含
_id
字段,您可以使用
选择rowID作为_id,
,就是这样。@DerGol…lum,重点是根据sqlite文档,一个INTEGER PRIMARY列的显式声明是rowID的别名(参见CL.answer评论中的引用)。因此我会复制列。@DerGol…lum,当然可以。这里的要点是它复制了列。我会有_ID和ROWID。为什么这样做?ROWID由SQLite自动插入。然后我不明白为什么要添加
\u ID
额外字段。根据文档:如果表包含整型主键类型的列,则该列将成为ROWID的别名。然后,您可以使用四个不同名称中的任意一个来访问ROWID,即上面描述的三个原始名称或整型主键列的名称。所有这些名称都是彼此的别名,在任何上下文中都同样有效。换句话说,显式声明整型主键列与不声明整型主键相同。您是否阅读了我链接到的页面?“真空”命令可能会更改任何没有显式整型主键的表中条目的rowid。”是的,但根据我粘贴的引号,INTEGER主键是ROWIDs的别名,这意味着VACUUM也会改变它。它可能是别名,但它是显式的。INTEGER主键列中的行ID不会改变。如果没有INTEGER主键,它们可以改变。