为了将旧的db迁移到房间库,我必须使等效行
primary key(id1, id2 desc)
从
create table t(
id1 integer not null,
id2 integer not null,
....
primary key(id1, id2 desc)
)
我找不到如何定义复合索引或主键的排序顺序。Android房间似乎没有特别的注释,或注释参数,见androidx.room.Entity或androidx.room.Index.
不支持吗?还有其他解决问题的方法吗?在上创建常规组合键id1和id2,在所有中选择查询集顺序
?除非您的表是WITHOUT ROWID
,否则表中的主键只是一个单独的唯一索引。
所以你只需要在表创建后创建你自己的索引。
在SQLite中主键需要索引吗?
看一下sqlite3的例子——sqlite只是为你创建了一个单独的sqlite_autoindex_t_with_pk_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.Callback
进行原始查询,因此您可以覆盖onCreate
回调方法并执行创建索引的原始sql。
你可以这样做
选择select_list从表格命令column_1 ASC,column_2 DESC;
查看详细信息https://www.sqlitetutorial.net/sqlite-order-by/