Java 执行get时,房间数据库正在更改项目的顺序

Java 执行get时,房间数据库正在更改项目的顺序,java,android,android-room,Java,Android,Android Room,有绝对标准的情况下,我保存在我的房间数据库的项目 共有4项。在我用Stetho保存它之后,我发现它们都按正确的顺序1、2、3、4保存 然后,当我需要得到他们所有 @Query("SELECT * FROM mytable WHERE name = :i AND state = :iS") List<MyObj> getAll(String i, String iS); @Query(“从mytable中选择*,其中name=:i和state=:iS”) List getAll(字

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


共有4项。在我用
Stetho
保存它之后,我发现它们都按正确的顺序1、2、3、4保存

然后,当我需要得到他们所有

@Query("SELECT * FROM mytable WHERE name = :i AND state = :iS")
List<MyObj> getAll(String i,  String iS);
@Query(“从mytable中选择*,其中name=:i和state=:iS”)
List getAll(字符串i,字符串iS);
我得到这样的订单1,2,4,3


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

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

@Entity
class Mytable {

   @PrimaryKey(autoGenerate = true)
   var id: Int? = null
   ...
}
您可以使用它根据插入的内容进行检索和排序

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


从我在您的代码中看到的情况来看,您的原因是您查询数据的方式,您可以与我一起剪切您计划归档的内容和代码的某些部分。

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

我刚刚遇到了一个类似的问题,并找出了困难所在

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

我发现这是由于实体中的一个变量被声明为public。出于某种原因,room把这个变量放在了我的表的开头。因为原始类和扩展类的模式顺序不同,所以我无法按照自己的意愿从一个表选择另一个表。当我将这个变量设置为private时,一切正常,卸载安装时顺序匹配


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

为什么不指定你需要按某物排序?你可以从mytable中选择*,其中name=:i和state=:is order by name'@Ogbe,但我不需要按某物排序,我需要按照从服务器端获取的顺序获取项目。当然,我可以给出所有项目的编号,但为什么?为什么我在DB中看到它的顺序是正确的,但当我尝试执行get方法时,我得到的项目顺序是错误的?“我看到它们都以正确的顺序1、2、3、4保存,就像它应该的那样”-这些是插入的主键id?@MarkKeen否,它是rowid。主键我使用自定义值。但主键不应影响顺序。。。没有?但我用我的自定义主密钥
@Entity(tableName=“mytable”,primaryKeys={“name”,“state”})
。我无法添加新的主键,因为我已经使用了一个。您是否有自动生成的id,如果您使用id,您是否有任何带有(autoGenerate=true)的变量?autoGenerate=true我只能与
PrimaryKey
一起使用,但由于我使用我的自定义,我无法将其设置为autogenerated。。。
'SELECT * FROM mytable WHERE name = :i AND state = :iS ORDER BY id DESC'