这有点令人困惑....如果我为每个表实现BaseColumns,它会自动为我创建一个名为_ID的自动增量主键,但是我是否需要为每个表创建自己的主键或者是多余的,甚至没有必要?
如果我需要自己的主键,让我们说_MyID,我猜主键是由_ID和我自己的(_MyID)形成的,对吧?所以在这种情况下,可以插入多个具有相同_MyID的寄存器....因为_ID是自动自动增量的,即:
_ID _MyID Other Fields.....
1 1000 ....
2 1000 ....
3 1000 ....
......等等
所以在这种情况下,如何控制只有一个寄存器的_MyID值为1000?
另外,我想我可以使用_ID列作为其他表的外键,对吗?
答案 0 :(得分:4)
BaseColumns._ID
的主要用途是Android的CursorAdapter
会在您提供的游标中查找该列名。也许还有其他课程可以做同样的事情,但我无法想到任何课程。如果您没有使用CursorAdapter
,那么您在表格中使用_id作为列名称并没有任何约束力,您可以根据需要命名列。
它会自动为我创建一个名为_ID
的自动增量主键
根据你到目前为止所展示的内容,它没有任何自动。如果你执行这样的SQL,你将只有这样一个列:
CREATE TABLE tableName (_id INTEGER PRIMARY KEY AUTOINCREMENT, ...);
您可以轻松地将其删除或为主键指定其他名称。此外,没有任何东西需要您的主键自动递增;只要值是唯一的,它就满足主键要求。换句话说,这也很好:
CREATE TABLE tableName (_id INTEGER PRIMARY KEY, ...);
如果我需要自己的主键,让我们说_MyID,我猜主键是由_ID和我自己的(_MyID)形成的,对吧?
不完全。你必须做这样的事情:
CREATE TABLE tableName (_id INTEGER, _myId INTEGER, ..., PRIMARY KEY(_id, myId));
这会创建一个复合键,但请注意,这两列中的任何一列都不会声明为主键。老实说,如果你不需要这样的安排,那就坚持一个主键。
最后一件事:
如果 计划使用CursorAdapter
,您可能希望将列_id命名为方便,但即便如此,您也不必这么做。重要的是游标具有该名称的列。表中的实际列可以有不同的名称,您只需在查询时对其进行别名,以便它在游标中具有正确的名称:
SELECT _myId as _id, ... FROM ...;