Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android room复合主键,排序顺序_Android_Android Room_Composite Primary Key - Fatal编程技术网

Android room复合主键,排序顺序

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, 第

为了将旧数据库迁移到room library,我必须使其等效于行

primary key(id1, id2 desc)

我找不到如何定义复合索引或主键的排序顺序。Android room似乎没有特定的注释,或者注释参数,如果看到androidx.room.Entityandroidx.room.Index


不支持吗?还有什么其他方法可以解决这个问题?在id1id2上创建常规复合键,并在所有中选择查询设置顺序依据

您可以这样做

挑选 从列表中选择 从…起 桌子 订购人 第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