Сортировать по значению родства?

У меня есть два класса объектов модели, которые связаны друг с другом:

class Car {

    private String model;

    private Manufacturer manufacturer;

    // getter and setter methods

}

А также:

class Manufacturer {

    private String name;

    // getter and setter methods

}

Как видите, объекты связаны между собой (у каждой машины есть производитель).

Теперь в Realm мне нужно получить все машины, но отсортировать их по имени производителя. Как я могу отсортировать по значению отношений?

Щас все, что у меня есть:

RealmResults<Car> cars = realm.where(Car.class).findAll();

Как я могу отсортировать это по названию производителя в порядке возрастания?


person Community    schedule 05.02.2017    source источник


Ответы (2)


Вы, наверное, заметили, но realm.where(Car.class).findAllSorted("manufacturer.name", Sort.ASCENDING) (сортировка ссылок) еще не поддерживается в Realm 2.3.x.

В вашем случае самый простой способ сделать это - использовать преимущества Realm как базы данных без SQL и просто сохранить имя производителя рядом с самим производителем.

class Car {

    private String model;

    private Manufacturer manufacturer;

    private String manufacturerName;

    public void setManufacturer(Manufacturer manufacturer) {
        if(manufacturer == null) { 
           this.manufacturerName = null; // direct field access works since 0.88.0
        } else {
           this.manufacturerName = manufacturer.getName();
        }
        this.manufacturer = manufacturer;
    }

}

А также:

class Manufacturer {

    private String name;

    // getter and setter methods

}

Теперь вы можете:

RealmResults<Car> cars = realm.where(Car.class)
                              .findAllSorted("manufacturerName", Sort.ASCENDING);
person EpicPandaForce    schedule 05.02.2017
comment
Не знаю почему, но это не работает. Хотя я скопировал и вставил именно так, как есть. - person ; 05.02.2017
comment
Похоже, что он присваивает null всем manufacturerName. Не знаю почему. - person ; 05.02.2017
comment
это возможно только в том случае, если установленный вами manufacturer равен null или их name равно нулю; но это также возможно, если вы используете Realm 0.87.5 или более раннюю версию. - person EpicPandaForce; 06.02.2017

Вам нужно что-то вроде ниже,

   class MyComp implements Comparator<Manufacturer>
   {

    @Override
    public int compare(Manufacturer o1, Manufacturer o2) {
        // 
    // Compare the o1 properties with o2 properties
   }

}
person DNAj    schedule 05.02.2017