执行获取时,Room DB正在更改项目的顺序

时间:2018-09-27 14:27:16

标签: java android android-room

在绝对标准的情况下,我将物品保存在Room DB中

有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

为什么?我在做什么错了?

3 个答案:

答案 0 :(得分:2)

不能保证您的数据将以相同的顺序返回。在SQL中,顺序不是数据集的固有属性。 Room是SQLite(SQL db引擎)之上的抽象。您需要按照建议的顺序订购数据。

答案 1 :(得分:1)

您需要指定排序方式,即使用主键/索引键,例如,您的表实体模板是这样

@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'

从我在您的代码中看到的那样,您拥有它的原因就是查询数据的方式,您可以与我一起了解计划归档的内容和部分代码。

答案 2 :(得分:0)

我只是遇到了类似的问题,并且弄清楚了到底发生了什么。

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

我发现这是由于该实体中的一个变量被声明为public。由于某种原因,房间将这个变量放在表的开头。由于原始类和扩展类的架构中的顺序不同,因此我无法按需要从一个表中选择另一个。当我将此变量设为私有时,一切正常,并且在卸载-安装时顺序匹配

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