Добавить новый объект в отношения в Realm

У меня проблема с Realm, от которой у меня болит мозг :(

Проблема в том, что я пытаюсь добавить новый объект в RealmList. Объект вставляется, но не связан с отношением.

Теперь моя база данных имеет несколько отношений:

Пользователь 1-->M Поездка 1-->M Автомобиль 1-->M

А потом:

Транспортное средство 1-->M Информация о транспортном средстве

Информация о транспортном средстве 1-->M Температура

Проблема возникает, когда я пытаюсь вставить новый объект в класс Temperature.

Мои курсы:

Автомобиль:

    @RealmClass
    public class Vehicle extends RealmObject
    {
        private String  state;                  //R: Reservado | P: Listo para embarcar | E: Embarcado | P1: Pdte. confirmar medidas | P2: Tª no válida | R1: No embarca
        private String  locata       = "";
        private String  customer     = "";
        private String  customerCode = "";
        private String  originPort   = "";      //Origin port
        private String  destinyPort  = "";      //Destiny port
        private int     fp;                     //Method pay (0 = CASH | 1 = CREDIT)

        //Relationship
        private Trip trip;                              //Inverse
        private RealmList<VehicleInfo>  vehicleInfo = new RealmList<>();    //One-to-many
        private RealmList<Observation> observations = new RealmList<>();;    //One-to-many
.....
}

Информация о транспортном средстве:

@RealmClass
public class VehicleInfo extends RealmObject {

    private String  sv;                  //Vehicle type
    private String  licensePlate  = "";  //License
    private String  seal          = "";  //Seal
    private String  temperature   = "";  //Temperature control
    private String  iv            = "";  //Ida/Vuelta
    private String  commodityCode = "";
    private int     tara          = 0;   //TARA
    private int     packages      = 0;   //Bultos
    private int     weight        = 0;
    private double  length        = 0.0; //Meters
    private boolean flagFT;              //Flag Technical data
    private boolean flagDua;
    private boolean flagManifest;
    private boolean flagTransport;
    private boolean flagDangerCommodity;

    //Relationship
    private RealmList<Temperature> temperatures = new RealmList<>();   //One-to-many
....
}

Мой код для добавления новой температуры:

Temperature temp = new Temperature();
temp.setDate(appCommon.getCurrentTimeOrDate("DATE"));
temp.setTime(appCommon.getCurrentTimeOrDate("TIME"));
temp.setValue(Double.parseDouble(etTemp.getText().toString()));

VehicleInfoPersistence.updateVehicleInfoTemperature(realm, vehicle.getLocata(), selectedUnitPosition, temp);
updateRecycler(tempRecyclerAdapter, temp);

Способ поиска и сохранения в Realm:

public static VehicleInfo findVehicleInfoFromLocata(Realm realm, String locata, int position) {
        RealmQuery<Vehicle> query = realm.where(Vehicle.class).equalTo("locata", locata);
        Vehicle realmVehicle = query.findFirst();

        return realmVehicle.getVehicleInfo().get(position);
    }

public static void updateVehicleInfoTemperature(Realm realm, String locata, int position, Temperature temperature) {

    Vehicle vehicle = VehiclePersistence.findVehicleFromLocata(realm, locata);

realm.beginTransaction();
Temperature realmTemp = realm.copyToRealm(temperature);
 vehicle.getVehicleInfo().get(position).getTemperatures().add(realmTemp);    
realm.commitTransaction();

}

Как я уже сказал, объект создается в базе данных, но он не связан с транспортным средством-->Информация о транспортном средстве-->Температура.

Что не так в моем коде??

Заранее спасибо :)


person Adae Rodríguez    schedule 19.11.2015    source источник
comment
Разве вы не пропустили realm.copyToRealmOrUpdate(vehicle); после добавления к нему температуры?   -  person Kayan Almeida    schedule 19.11.2015
comment
Не работает. Сбой со следующим исключением: java.lang.IllegalArgumentException: RealmObject без @PrimaryKey не может быть обновлен: class io.realm.VehicleRealmProxy :(   -  person Adae Rodríguez    schedule 19.11.2015
comment
Как выглядит findVehicleFromLocata?   -  person beeender    schedule 20.11.2015
comment
Привет, @beeender. Я отредактировал свой вопрос и добавил findVehicleFromLocata. Спасибо :)   -  person Adae Rodríguez    schedule 20.11.2015
comment
@AdaeRodríguez Ваш код выглядит нормально. Не могли бы вы воспроизвести эту проблему с помощью примера проекта и поделиться с нами кодом? Вы можете отправить его на [email protected]   -  person beeender    schedule 23.11.2015
comment
Проблема может быть при попытке добавить новый объект в подмассив?? Vehicle.getVehicleInfo().get(position).getTemperatures().add(realmTemp);   -  person Adae Rodríguez    schedule 23.11.2015
comment
Подтвержденный!!! Сбой Realm при попытке добавить новый объект в подмассив. Я разместил свой ответ ниже   -  person Adae Rodríguez    schedule 23.11.2015


Ответы (1)


Я решил свою проблему :)

По какой-то причине область терпит неудачу, когда я пытаюсь добавить новый объект в подмассив RealmClass.

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

public static void updateVehicleInfoTemperature(Realm realm, String locata, int position, Temperature temperature) {

    Vehicle vehicle = VehiclePersistence.findVehicleFromLocata(realm, locata);

    realm.beginTransaction();

    VehicleInfo vInfo            = vehicle.getVehicleInfo().get(position);
    VehicleInfo realmVehicleInfo = realm.copyToRealm(vInfo);
    Temperature realmTemp        = realm.copyToRealm(temperature);
    realmVehicleInfo.getTemperatures().add(realmTemp);

    realm.commitTransaction();
}

Надеюсь кому-то помочь :)

person Adae Rodríguez    schedule 23.11.2015