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

Posted

技术标签:

【中文标题】Android房间复合主键,排序顺序【英文标题】:Android room composite primary key, sort order 【发布时间】:2021-04-24 14:18:57 【问题描述】:

为了将旧数据库迁移到房间库,我必须等效于行

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 上创建常规复合键,并在所有 select 查询中设置 order by ?

【问题讨论】:

【参考方案1】:

除非您的表是WITHOUT ROWID,否则您的表中的主键只是一个单独的唯一索引。

所以你只需要在创建表后创建自己的索引。

Is an index needed for a primary key in 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

【讨论】:

【参考方案2】:

Room 支持通过RoomDatabase.Callback 进行原始查询,因此您可以覆盖回调的onCreate 方法并执行创建索引的原始sql。

【讨论】:

【参考方案3】:

你可以这样做

选择 选择列表 从 桌子 订购方式 column_1 ASC, column_2 DESC;

详情https://www.sqlitetutorial.net/sqlite-order-by/

【讨论】:

对不起,我应该指定我需要先通过 Android.Room 来做,但是是的,谢谢,我考虑过通过 order by 扩展 sql 查询 你可以从这里得到想法***.com/questions/55297165/…

以上是关于Android房间复合主键,排序顺序的主要内容,如果未能解决你的问题,请参考以下文章

SpringData JPA复合主键

如何在房间中制作复合键

仅在主表上作为复合主键

mysql的联合主键与复合主键区别

复合主键?还是具有唯一复合索引的自动增量主键? [关闭]

使用复合/复合主键的缺点是啥?