Android room复合主键,排序顺序
为了将旧数据库迁移到room library,我必须使其等效于行Android room复合主键,排序顺序,android,android-room,composite-primary-key,Android,Android Room,Composite Primary Key,为了将旧数据库迁移到room library,我必须使其等效于行 primary key(id1, id2 desc) 从 我找不到如何定义复合索引或主键的排序顺序。Android room似乎没有特定的注释,或者注释参数,如果看到androidx.room.Entity或androidx.room.Index 不支持吗?还有什么其他方法可以解决这个问题?在id1和id2上创建常规复合键,并在所有中选择查询设置顺序依据?您可以这样做 挑选 从列表中选择 从…起 桌子 订购人 第1列ASC, 第
primary key(id1, id2 desc)
从
我找不到如何定义复合索引或主键的排序顺序。Android room似乎没有特定的注释,或者注释参数,如果看到androidx.room.Entity或androidx.room.Index
不支持吗?还有什么其他方法可以解决这个问题?在id1和id2上创建常规复合键,并在所有中选择查询设置顺序依据?您可以这样做 挑选 从列表中选择 从…起 桌子 订购人 第1列ASC, 第2列描述
详细信息除非您的表是
而没有ROWID
,否则表中的主键只是一个单独的唯一索引
因此,在创建表之后,您只需创建自己的索引
看看sqlite3示例——sqlite只是为您创建了一个单独的sqlite\u autoindex\u t\u,带有\u pk\u 1
,以及手动创建的索引
sqlite> create table t_with_pk(id1 integer not null, id2 integer not null, primary key(id1, id2 desc));
sqlite> create table t_no_pk(id1 integer not null, id2 integer not null);
sqlite> create unique index t_uniq_idx on t_no_pk(id1, id2 desc);
sqlite> select * from sqlite_master;
table|t_with_pk|t_with_pk|2|CREATE TABLE t_with_pk(id1 integer not null, id2 integer not null, primary key(id1, id2 desc))
index|sqlite_autoindex_t_with_pk_1|t_with_pk|3|
table|t_no_pk|t_no_pk|4|CREATE TABLE t_no_pk(id1 integer not null, id2 integer not null)
index|t_uniq_idx|t_no_pk|5|CREATE UNIQUE INDEX t_uniq_idx on t_no_pk(id1, id2 desc)
行为也是一样的
sqlite> explain query plan select * from t_with_pk order by id1, id2 desc;
QUERY PLAN
`--SCAN TABLE t_with_pk USING COVERING INDEX sqlite_autoindex_t_with_pk_1
sqlite> explain query plan select * from t_no_pk order by id1, id2 desc;
QUERY PLAN
`--SCAN TABLE t_no_pk USING COVERING INDEX t_uniq_idx
另请注意(关于@Developer的回答),只要颠倒SELECT
语句中的顺序,就需要sqlite创建临时索引
sqlite> explain query plan select * from t_no_pk order by id1, id2;
QUERY PLAN
|--SCAN TABLE t_no_pk USING COVERING INDEX t_uniq_idx
`--USE TEMP B-TREE FOR RIGHT PART OF ORDER BY
Room支持通过
RoomDatabase进行原始查询。回调
,因此您可以覆盖onCreate
回调方法并执行创建索引的原始sql。对不起,我应该指定我需要通过安卓进行此操作。Room首先,但是,是的,谢谢,我考虑过按顺序扩展sql查询。您可以从这里获得想法
sqlite> explain query plan select * from t_no_pk order by id1, id2;
QUERY PLAN
|--SCAN TABLE t_no_pk USING COVERING INDEX t_uniq_idx
`--USE TEMP B-TREE FOR RIGHT PART OF ORDER BY