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)
生成的SQLCREATE 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
对应于SQLiteAUTOINCREMENT
。但是,很明显,自动生成唯一主键不需要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主键
?这在目前是不可能的-唯一的选项是自动递增
。您可以启动此用例支持的进度更新