2

看着这个答案,我试图弄清楚如何实际创建一个表,其中的列只是 ROWID 的别名。我想这样做,因为某些 android 类需要一个名为“_id”的唯一列,但我不希望该列成为主键。我不能在不是 PK 的 col 上使用 AUTO_INCREMENT,所以我希望 _id 成为别名。我知道我可以在查询中做到这一点,但这对我的情况不实用。任何指针?这甚至可能吗?

谢谢 :)

编辑:真的我只是希望能够拥有自己的 PK,但也有一个 id 字段供 CursorAdapters 正常工作等

编辑:查看我是否必须使用 _ID 作为 SQlite 主键?它必须是INT吗?(Android Dev)如果我的 PK 也是数字类型,它建议在查询中执行此操作,但如果它是我用于我的 PK 的 TEXT col 怎么办?(在这里大声思考)-我想我可以复制CursorAdaptor并且只是 getString 而不是 _id col 的 long (另外,将 col 的名称作为 PK 传递给光标适配器,摆脱 _id!)或者只是在 SELECT 中为 ROWID 添加一个别名作为 _id,虽然感觉有点 hacky...

4

2 回答 2

2

您可能有一个完全独立于 SQLite 内置rowid的主键。

每个 SQLite 表的每一行都有一个 64 位有符号整数键,用于唯一标识其表中的行。这个整数通常称为“rowid”。可以使用与特殊大小写无关的名称“rowid”、“oid”或“ rowid ”之一来代替列名来访问 rowid 值。

_id您可以制定查询,以便CursorAdaptor通过将隐藏的 rowid 列添加到结果中来调用内置的 rowid :

select _rowid_ as _id, ...

rowid 是唯一的,但不必是主键。您可以在 CREATE TABLE 语句中设置任何您喜欢的主键。

于 2012-07-06T17:41:01.413 回答
0

TBH,我不认为这真的可行。您需要拥有这种 PK 专栏(即使有很多黑客攻击,您也可以创建某种解决方法)。

我宁愿建议将 _id 列作为技术 PK 并有一个附加列作为逻辑 PK,即只是一个具有唯一约束的自由定义的列。然后,您的程序逻辑应该能够简单地将逻辑 PK 用于所有操作。当然,这需要您使用自定义查询进行查找操作等,但这通常更合适。

hth..

于 2012-07-06T17:29:58.613 回答