执行 get 时 Room DB 正在更改项目的顺序

Room DB is changing order of items when execute get

绝对标准的情况下我将项目保存在我的房间数据库中

有 4 个项目。在 Stetho 的帮助下保存后,我看到它们都按正确的顺序 1、2、3、4 保存,就像它应该的那样。

然后当我需要把它们全部拿走时

@Query("SELECT * FROM mytable WHERE name = :i AND state = :iS")
List<MyObj> getAll(String i,  String iS);

我得到这样的订单 1, 2, 4, 3

为什么?我做错了什么?

您需要指定应该如何排序,要么您使用主 key/index 键,例如,如果您的 table 实体模板是这样的

@Entity
class Mytable {

   @PrimaryKey(autoGenerate = true)
   var id: Int? = null
   ...
}

您可以使用它来根据插入的内容进行检索和排序

'SELECT * FROM mytable WHERE name = :i AND state = :iS ORDER BY id ASC'

'SELECT * FROM mytable WHERE name = :i AND state = :iS ORDER BY id DESC'

从我在你的代码中看到的情况来看,你之所以这样做是因为你查询数据的方式,你可以和我一起剪切你计划存档的内容和你的代码的一部分。

无法保证您的数据会以相同的顺序返回。在SQL中,顺序不是一组数据固有的属性。 Room 是 SQLite(SQL 数据库引擎)之上的抽象。您需要按照建议对数据进行排序。

我刚刚遇到了类似的问题,并弄清楚了问题所在。

我想创建 2 个相同的 table,所以我只是扩展了一个现有的 class 并将实体注释添加到扩​​展的 class 中,出于某种原因,只有扩展实体有一列顺序错误。

我发现这是由于实体中的一个变量被声明为 public。 room 出于某种原因将这个变量放在我的 table 的开头。由于原始模式和扩展模式 class 中的顺序不同,我无法 select 从一个 table 到另一个我想要的。当我将此变量设为私有时,一切正常,并且卸载安装时的顺序匹配

当我看到你的问题时,它刚刚响了。也许在你的实体中 class 3 是唯一的私有变量,因此被降级到最后