Область отношений «Многие ко многим»

#android #realm

#Android #сфера

Вопрос:

Моя цель — иметь отношения «многие ко многим» внутри одного класса в Realm. Я попытался добавить объект в RealmList таким образом :

 Realm realm = Realm.getDefaultInstance();
            DeviceEntity device = realm.where(DeviceEntity.class).equalTo(Constants.DEVICE_PARAM_DEVICE_ID, deviceId).findFirst();
            DeviceEntity deviceToBeAdded = realm.where(DeviceEntity.class).equalTo(Constants.DEVICE_PARAM_DEVICE_ID, deviceIdToAdd).findFirst();

            if(device != null amp;amp; deviceToBeAdded != null){

                realm.beginTransaction();

                device.getConnectedDevices().add(deviceToBeAdded);
                realm.copyToRealmOrUpdate(device);
                realm.commitTransaction();


            }
  

Когда я пытаюсь извлечь все объекты DeviceEntity, хранящиеся в области, подобной этой :

  Realm realm = Realm.getDefaultInstance();
            final RealmResults<DeviceEntity> realmResults = realm
                    .where(DeviceEntity.class)
                    .findAll();


            List<DeviceEntity> list = Arrays.asList(realmResults.toArray(new DeviceEntity[realmResults.size()]));
  

Для всех объектов DeviceEntity getConnectedDevices() возвращает null

 public class DeviceEntity extends RealmObject{

@PrimaryKey
private long id;
private String name;
private String deviceId;
private String deviceType;
private RealmList<DeviceEntity> connectedDevices = new RealmList<>();

public DeviceEntity() {

}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getDeviceId() {
    return deviceId;
}

public void setDeviceId(String deviceId) {
    this.deviceId = deviceId;
}

public String getDeviceType() {
    return deviceType;
}

public void setDeviceType(String deviceType) {
    this.deviceType = deviceType;
}

public RealmList<DeviceEntity> getConnectedDevices() {
    return connectedDevices;
}

public void setConnectedDevices(RealmList<DeviceEntity> connectedDevices) {
    this.connectedDevices = connectedDevices;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    DeviceEntity that = (DeviceEntity) o;

    if (id != that.id) return false;
    if (name != null ? !name.equals(that.name) : that.name != null) return false;
    if (deviceId != null ? !deviceId.equals(that.deviceId) : that.deviceId != null)
        return false;
    if (deviceType != null ? !deviceType.equals(that.deviceType) : that.deviceType != null)
        return false;
    return connectedDevices != null ? connectedDevices.equals(that.connectedDevices) : that.connectedDevices == null;

}

@Override
public int hashCode() {
    int result = (int) (id ^ (id >>> 32));
    result = 31 * result   (name != null ? name.hashCode() : 0);
    result = 31 * result   (deviceId != null ? deviceId.hashCode() : 0);
    result = 31 * result   (deviceType != null ? deviceType.hashCode() : 0);
    result = 31 * result   (connectedDevices != null ? connectedDevices.hashCode() : 0);
    return resu<
}

public static int getNextPrimaryKey(Realm realm){
    int key;
    try {
        Number number = realm.where(DeviceEntity.class).max("id");
        key = number != null ? (number.intValue()   1) : 1;
    } catch(ArrayIndexOutOfBoundsException ex) {
        key = 1;
    }

    return key;
}
  

}

Как я должен извлекать подключенные устройства?

Редактировать:

Я пытался добиться связывания, но также без эффекта, RealmList по-прежнему равен нулю после извлечения из базы данных.

 final Realm realm = Realm.getDefaultInstance();
                final DeviceEntity device = realm.where(DeviceEntity.class).equalTo(Constants.DEVICE_PARAM_DEVICE_ID, deviceId).findFirst();
                final DeviceEntity deviceToBeAdded = realm.where(DeviceEntity.class).equalTo(Constants.DEVICE_PARAM_DEVICE_ID, deviceIdToAdd).findFirst();

                try {
                    realm.executeTransaction(new Realm.Transaction() {
                        @Override
                        public void execute(Realm realm) {

                            if(device != null amp;amp; deviceToBeAdded != null){

                                device.getConnectedDevices().add(deviceToBeAdded);
                                realm.insertOrUpdate(device);

                                subscriber.onCompleted();
                            }

                        }
                    });
                } finally {
                    if(realm != null) {
                        realm.close();
                    }
                }
  

Комментарии:

1. Ваши запросы должны находиться внутри транзакции, и вы должны надежно закрывать экземпляры своей области.

2. @EpicPandaForce, к сожалению, представленное решение также не работает для меня.

3. Подписчик? Это Rx? На каком планировщике это запущено?

4. .observeOn(AndroidSchedulers.MainThread()) .subscribeeon(Schedulers.io ())

5. Ваши запросы должны быть внутри транзакции.