android - Android中BaseColumns的_ID主键有什么用

标签 android sqlite

这有点令人困惑....如果我为我的每个表实现 BaseColumns,它会自动为我创建一个名为 _ID 的自动递增主键,但是我是否还需要为我的每个表创建我自己的主键还是多余甚至没有必要?

如果我需要自己的主键,比方说,_MyID,我想主键将由 _ID 和我自己的 (_MyID) 组成,对吧?所以在这种情况下,可以插入多个具有相同 _MyID 的寄存器....因为 _ID 是自动递增的,即:

_ID      _MyID  Other Fields.....
1         1000  ....
2         1000  ....
3         1000  ....

...等等

那么在这种情况下,如何控制_MyID只能有一个寄存器的值为1000呢?

此外,我想我可以使用 _ID 列作为其他表的外键,对吧?

最佳答案

BaseColumns._ID 的主要用途是 Android 的 CursorAdapter将在您提供的光标中查找该列名。可能还有其他类做同样的事情,但我想不出有什么。如果您不使用 CursorAdapter,那么实际上没有什么可以限制您使用 _id 作为表中的列名,您可以随意命名该列。

it automatically create an autoincremented primary key for me called _ID

根据您目前展示的内容,没有什么是自动的。如果你像这样执行 SQL,你只会有这样一个列:

CREATE TABLE tableName (_id INTEGER PRIMARY KEY AUTOINCREMENT, ...);

您可以轻松地将其省略或为主键指定一个不同的名称。此外,没有什么需要您的主键自动递增;只要值是唯一的,它就满足主键要求。换句话说,这也很好:

CREATE TABLE tableName (_id INTEGER PRIMARY KEY, ...);

In case I need my own primary key, let's say, _MyID, I guess the primary key will be formed by _ID and my own (_MyID), right?

不完全是。你必须做这样的事情:

CREATE TABLE tableName (_id INTEGER, _myId INTEGER, ..., PRIMARY KEY(_id, myId));

这会创建一个复合键,但请注意,这两列本身都没有声明为主键。老实说,如果您不需要这样的安排,请坚持使用一个主键。

最后一件事:

如果您计划使用CursorAdapter,为了方便起见,您可能希望将列命名为_id,但即便如此您也不必这样做。重要的是游标 有一个同名的列。表中的实际列可以有不同的名称,您只需在查询时为其添加别名,以便它在游标中具有正确的名称:

SELECT _myId as _id, ... FROM ...;

关于android - Android中BaseColumns的_ID主键有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27681391/

相关文章:

java - 为什么 android studio 显示错误 "Error:(38, 0) Plugin with id ' com.google.gms.google-services' not found”

android - 授予当前用户对/dev/kvm 的访问权限

android - FFMPEG 音频转换花费了太多时间

python - 我不知道如何在数据库上执行 SUM 函数并将值存储到 python 变量中

android - 在图书馆项目中使用 Room DB

python - Python3 的 sqlite3 模块中自动提交的问题

iphone - 在应用程序卸载时保留 SQLite 数据

android - 小米5 'It seems that your device does not support camera(or it is locked) Application will be closed'问题

android - 在 webview 中播放嵌入在 url 中的 YouTube 视频

iphone - 将数据插入 SQLite db iPhone 的正确方法