BaseColumns';Android中的s_ID主键

BaseColumns';Android中的s_ID主键,android,sqlite,Android,Sqlite,这有点令人困惑。。。。如果我为每个表实现BaseColumns,它会自动为我创建一个称为_ID的自动递增主键,但是我是否也需要为每个表创建自己的主键,或者它是多余的,甚至是不必要的 如果我需要我自己的主键,比如说,_MyID,我想主键将由_ID和我自己的(_MyID)组成,对吗?因此,在这种情况下,可以使用相同的_MyID插入多个寄存器。。。。因为_ID是自动递增的,即: _ID _MyID Other Fields..... 1 1000 .... 2

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

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

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

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


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

BaseColumns的主要用途。_ID是Android会在你给它的光标中查找该列名。也许还有其他的课程也这么做,但我想不出有哪门课是我脑子里想出来的。如果您没有使用
CursorAdapter
,那么在表中使用_id作为列名并没有任何约束,您可以随意命名列

它会自动为我创建一个名为_ID的自动递增主键

根据你到目前为止所展示的内容,它并不是自动的。只有执行如下SQL时,才会有这样一列:

CREATE TABLE tableName (_id INTEGER PRIMARY KEY AUTOINCREMENT, ...);
CREATE TABLE tableName (_id INTEGER, _myId INTEGER, ..., PRIMARY KEY(_id, myId));
您可以很容易地将其省略,或者为主键指定不同的名称。此外,没有任何东西要求主键自动递增;只要值是唯一的,它就满足主键要求。换句话说,这也很好:

CREATE TABLE tableName (_id INTEGER PRIMARY KEY, ...);
如果我需要我自己的主键,比如说,_MyID,我想主键将由_ID和我自己的(_MyID)组成,对吗

不完全是。您必须执行以下操作:

CREATE TABLE tableName (_id INTEGER PRIMARY KEY AUTOINCREMENT, ...);
CREATE TABLE tableName (_id INTEGER, _myId INTEGER, ..., PRIMARY KEY(_id, myId));
这将创建一个复合键,但请注意,这两列本身都没有声明为主键。老实说,如果你不需要这样的安排,那么坚持使用一个主键

最后一件事:

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

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

BaseColumns.\u ID
的主要用途是,Android将在您给定的光标中查找该列名。也许还有其他的课程也这么做,但我想不出有哪门课是我脑子里想出来的。如果您没有使用
CursorAdapter
,那么在表中使用_id作为列名并没有任何约束,您可以随意命名列

它会自动为我创建一个名为_ID的自动递增主键

根据你到目前为止所展示的内容,它并不是自动的。只有执行如下SQL时,才会有这样一列:

CREATE TABLE tableName (_id INTEGER PRIMARY KEY AUTOINCREMENT, ...);
CREATE TABLE tableName (_id INTEGER, _myId INTEGER, ..., PRIMARY KEY(_id, myId));
您可以很容易地将其省略,或者为主键指定不同的名称。此外,没有任何东西要求主键自动递增;只要值是唯一的,它就满足主键要求。换句话说,这也很好:

CREATE TABLE tableName (_id INTEGER PRIMARY KEY, ...);
如果我需要我自己的主键,比如说,_MyID,我想主键将由_ID和我自己的(_MyID)组成,对吗

不完全是。您必须执行以下操作:

CREATE TABLE tableName (_id INTEGER PRIMARY KEY AUTOINCREMENT, ...);
CREATE TABLE tableName (_id INTEGER, _myId INTEGER, ..., PRIMARY KEY(_id, myId));
这将创建一个复合键,但请注意,这两列本身都没有声明为主键。老实说,如果你不需要这样的安排,那么坚持使用一个主键

最后一件事:

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

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

非常感谢您提供的详细信息,请为您指点。有一件事,我想CursorAdapter必须确保_ID列不仅是整数,而且是主键,因为该列必须是唯一的,也就是说,不能存在多个具有相同_ID值的记录,对吗?但是如果我使用复合主键,比如说,主键(_ID,myId),那么在这种情况下,多个寄存器可能具有相同的_ID值,但不具有相同的主键。。。。那么在这种情况下,会发生什么?我猜游标将不会工作,因为它期望_ID值是唯一的……最后,如果我声明_ID为主键,但我没有声明为自动递增,当我插入记录时,会自动生成_ID,但使用哪个值?使用Autoincremented很明显,它将是1、2、3等等……在SQLite中,每个表都有一个内部管理的列,名为ROWID。这是自动生成整数值的列。如果(且仅当)声明了列整数主键,则该列将成为ROWID的别名。AUTOINCREMENT关键字仅对生成ROWID的算法稍有更改。因此,您甚至不需要声明整数主键列,只需
选择rowid作为_id
。您可以手动将值插入到整数主键列(声明的主键列或未声明的ROWID主键列)中,但这些值必须是唯一的。非常感谢您提供的详细信息,请指正。有一件事,我想CursorAdapter必须确保_ID列不仅是整数,而且是主键,因为该列必须是唯一的,也就是说,不能存在多个具有相同_ID值的记录,对吗?但是如果我使用一个复合主键,比如说,主键(_ID,myId),那么在这种情况下可能会有多个