Android房间组合主键,排序顺序



为了将旧的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.Entityandroidx.room.Index.

不支持吗?还有其他解决问题的方法吗?在上创建常规组合键id1id2,在所有中选择查询集顺序

?

除非您的表是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/

最新更新