在Android中使用BaseColumns的_ID主键有什么用处

时间:2014-12-28 22:50:38

标签: android sqlite

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

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

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

......等等

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

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

1 个答案:

答案 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 ...;