Android 是否有任何方法可以在没有自动增量的情况下生成自动生成的主键?

Android 是否有任何方法可以在没有自动增量的情况下生成自动生成的主键?,android,sqlite,android-sqlite,android-room,Android,Sqlite,Android Sqlite,Android Room,“我的房间”数据库具有以下实体: @Entity public class SmsMessage { @PrimaryKey public long id; public boolean incoming; public String sender; public String receiver; public String body; public long timestamp; } 当尝试向数据库中插入多个项目时,此操作失败,出现以

“我的房间”数据库具有以下实体:

@Entity
public class SmsMessage {
    @PrimaryKey
    public long id;

    public boolean incoming;
    public String sender;
    public String receiver;
    public String body;
    public long timestamp;
}
当尝试向数据库中插入多个项目时,此操作失败,出现以下
RuntimeException

SQLiteConstraintException: PRIMARY KEY must be unique (code 19)
生成的SQL
CREATE TABLE
语句如下所示:

CREATE TABLE `SmsMessage` (
    `id`    INTEGER NOT NULL,
    `incoming`  INTEGER NOT NULL,
    `sender`    TEXT,
    `receiver`  TEXT,
    `body`  TEXT,
    `timestamp` INTEGER NOT NULL,
    PRIMARY KEY(`id`)
);
这似乎不同于
INTEGER NOT NULL主键
,尽管我在中找不到任何关于此行为的文档

似乎我必须使用
@PrimaryKey(autogenerate=true)
来腾出空间自动生成主键值。使用
autogenerate=true
时查看生成的数据库,会生成以下SQL:

CREATE TABLE `SmsMessage` (
    `id`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    `incoming`  INTEGER NOT NULL,
    `sender`    TEXT,
    `receiver`  TEXT,
    `body`  TEXT,
    `timestamp` INTEGER NOT NULL
);
似乎
autogenerate=true
对应于SQLite
AUTOINCREMENT
。但是,很明显,自动生成唯一主键不需要
AUTOINCREMENT
(在大多数情况下不推荐使用)。
AUTOINCREMENT
的目的基本上是防止重复使用已使用但已删除的主键

AUTOINCREMENT关键字会带来额外的CPU、内存、磁盘空间和磁盘I/O开销,如果不严格需要,应避免使用。它通常是不需要的

在SQLite中,类型为INTEGER主键的列是ROWID的别名(不含ROWID表的中除外),它始终是64位有符号整数

在INSERT中,如果未显式为ROWID或INTEGER主键列指定值,则会自动使用未使用的整数填充该列,通常比当前使用的最大ROWID多出一个整数。无论是否使用AUTOINCREMENT关键字,这都是正确的

如果AUTOINCREMENT关键字出现在INTEGER主键之后,则会更改自动ROWID分配算法,以防止在数据库的生命周期内重复使用ROWID。换句话说,自动增量的目的是防止重用以前删除的行中的rowid

因此,似乎通常不需要也不推荐使用
@PrimaryKey(autogenerate=true)
。但仅使用
@PrimaryKey
根本不会自动生成值


我如何告诉Room我想要的是
'id'INTEGER NOT NULL主键

这在目前是不可能的-唯一的选项是
自动递增
。您可以启动此用例支持的进度更新