在ORDER BY中使用Room的@Relation

oli*_*ejp 7 android android-room

我尝试了Room库,顺便说一下,这是一个非常令人印象深刻的库!

所以我有两个@Entity和一个由两个实体组成的POJO。

我的第一个实体=>

    @Entity(tableName = "colis")
      public class ColisEntity {
        @PrimaryKey
        private String idColis;
        private String label;
      }  
Run Code Online (Sandbox Code Playgroud)

我的第二个具有外键的实体=>

    @Entity(tableName = "step",
                foreignKeys = @ForeignKey(entity = ColisEntity.class,
 parentColumns = "idColis",
 childColumns = "idColis",
 onDelete = CASCADE))
        public class StepEntity {

            @PrimaryKey(autoGenerate = true)
            private Integer idStep;
            private String idColis;
            private Long date;
        }
Run Code Online (Sandbox Code Playgroud)

我的POJO与@Relation

public class ColisWithSteps {
        @Embedded
        public ColisEntity colisEntity;

        @Relation(parentColumn = "idColis", entityColumn = "idColis")
        public List<StepEntity> stepEntityList;
    }
Run Code Online (Sandbox Code Playgroud)

所有这些东西都可以在我的@Dao和存储库中正常工作。

但是我希望我的@Relation List可以按日期排序,并且我不希望StepEntity实现Comparable并创建Collections.sort()。

原因我认为排序应该由数据库而不是在查询之后进行。

任何的想法 ?

谢谢。

Jra*_*o11 10

我知道 OP 对 Collection.Sort() 说不,但鉴于这种情况,它似乎是最干净的方法。正如我上面所说,我认为这样可以更好地避免每次需要访问数据时都必须进行单独的查询。首先实现 Comparable。

public class StepEntity implements Comparable<StepEntity >{
    @PrimaryKey(autoGenerate = true)
    private Integer idStep;
    private String idColis;
    private Long date;

   @Override
    public int compareTo(@NonNull StepEntity stepEntity ) {
        int dateOther = stepEntity.date;

        //ascending order
        return this.date - dateOther;

       //descending order
       //return dateOther - this.date;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在要使用它,请在现有的 @Relation POJO 中添加一个方法包装器

public class ColisWithSteps {
        @Embedded
        public ColisEntity colisEntity;

        @Relation(parentColumn = "idColis", entityColumn = "idColis")
        public List<StepEntity> stepEntityList;

        //add getter method
        public List<StepEntity> getSortedStepEntityList(){
           Collections.sort(stepEntityList);
           return stepEntityList;
       }
    }
Run Code Online (Sandbox Code Playgroud)


Dan*_*iev 1

我认为当前版本的 Room 中没有内置方法可以执行此操作。

我可以提出两种可能的解决方案。

  1. @Relation只需使用两个单独的查询来获取对象,而不是使用 POJO 。这样您就可以StepEntity完全按照您喜欢的方式订购实例。当你得到ColisEntity所有有序的对应StepEntity记录时,你可以ColisWithSteps在你的repo层构造一个对象并返回它。
  2. 您可以创建一个数据库视图,StepEntity以所需的顺序对记录进行排序,然后使用房间中的此答案视图来使用它。

我认为选项 1 对于您的情况来说是最好的 - 是的,它将涉及使用两个查询,但至少它不会破坏您的数据库迁移,并且您将能够利用 Room 来发挥您的优势。

  • 第一种方法的问题是你会丢失 Observable 属性 (3认同)