【问题标题】:In Android Sqlite is ROWID same as primary Key?在 Android Sqlite 中,ROWID 与主键相同吗?
【发布时间】:2023-03-04 07:46:07
【问题描述】:

我有一个具有以下架构的表:

public static final String PRIMARY_KEY = "_id";
public static final String TASK_NAME = "name";
public static final String TASK_DESCRIPTION = "description";
public static final String IS_TASK_COMPLETED = "is_completed";
public static final String IS_TASK_DELETED = "is_deleted";
public static final String TASK_START_DATE = "start_date";
public static final String TASK_START_TIME = "start_time";
public static final String ESTIMATED_TASK_END_DATE = "end_date";
public static final String TIMESTAMP = "timestamp";

在一个片段中,我使用insert() 方法在表中插入一行。我知道这会返回插入行的rowId,但在this 线程中我读到了

如果一个表包含一个 INTEGER PRIMARY KEY 类型的列,那么 列成为 ROWID 的别名。然后您可以访问 ROWID 使用四个不同名称中的任何一个,描述的原始三个名称 以上或赋予 INTEGER PRIMARY KEY 列的名称。所有这些 名称是彼此的别名,并且在任何情况下都同样有效 上下文。

所以返回的 rowId 是否与主键相同。但是,如果删除一行并插入另一行,那么rowId 是否与primary key value "id" 相同?

【问题讨论】:

  • 您的问题不清楚。如果您删除一条记录然后执行INSERT,您是否在问rowId 会发生什么?
  • 是的。我的意思是rowId的值和主键总是一样的吗?
  • 还是不清楚……但是如果你把列整型和主键做成,那么rowId应该是主键的同义词。
  • 如果我在表中有一行,其 rowId 值为 8,主键值为 8。如果我删除这一行并插入另一行。 new PK 的值为 9。new rowId 的值是多少?
  • 如果你有一个整数 PID 列,那么 SQLite 可能使用9 作为下一个值。但如果您没有将列设置为自动递增,它也可以使用另一个值。但是所有的赌注都没有了,因为你有一个String PID 列。

标签: android database sqlite


【解决方案1】:

所有表(忽略 exceptions)都有一个行 ID。

当没有声明为 INTEGER PRIMARY KEY 的列时,rowid 与其他列分开:

CREATE TABLE A ( _id INT PRIMARY KEY, name TEXT ); -- not "INTEGER"

| rowid | _id | name |
+-------+-----+------+
|     1 |   1 | this |
|     2 |   2 | that |
|     3 |  30 | NULL |  -- does not need to be the same

如果一个 INTEGER PRIMARY KEY 列,rowid 和声明的列名都是 same 值的别名:

CREATE TABLE B ( _id INTEGER PRIMARY KEY, name TEXT );

| rowid | name |
| = _id |      | 
+-------+------+
|     1 | this |
|     2 | that |
|     3 | NULL |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-05
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多