2015-12-14 4 views
0

В настоящее время я пытаюсь добавить RealmObject в RealmList внутри другого RealmObject.Добавление RealmObject в RealmList в Android

Так вот как я это делаю сейчас.

Сначала я создать и сохранить RealmObject под названием "RouteRealm", как это:

public void insertNewRoute(int routeId, long routeDate) { 
    realm.beginTransaction(); 
    RouteRealm routeRealm = realm.createObject(RouteRealm.class); 
    routeRealm.setId(routeId); 
    routeRealm.setDate(routeDate); 
    realm.commitTransaction(); 
} 

Класс RealmObject выглядит следующим образом:

public class RouteRealm extends RealmObject { 

    @PrimaryKey 
    private int id; 
    private long date; 
    private RealmList<RoutePointRealm> routePoints; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 
    public long getDate() { 
     return date; 
    } 

    public void setDate(long date) { 
     this.date = date; 
    } 

    public RealmList<RoutePointRealm> getRoutePoints() { 
     return routePoints; 
    } 

    public void setRoutePoints(RealmList<RoutePointRealm> routePoints) { 
     this.routePoints = routePoints; 
    } 
} 

указанных работ. Проблема возникает, когда я пытаюсь добавить RoutePointRealm в список, называемый routePoints. Вот мой код для добавления объекта RoutePointRealm к списку:

public void insertNewRoutePoint(int routeId, String address, float latitude, float longitude, long routePointId, long routePointTime) { 
     realm.beginTransaction(); 
     RouteRealm routeRealm = realm.where(RouteRealm.class).equalTo("id", routeId).findFirst(); 

     RoutePointRealm routePointRealm = realm.createObject(RoutePointRealm.class); 
     routePointRealm.setAddress(address); 
     routePointRealm.setLatitude(latitude); 
     routePointRealm.setLongitude(longitude); 
     routePointRealm.setRoutePointID(routePointId); 
     routePointRealm.setRoutepointTime(routePointTime); 
     routeRealm.getRoutePoints().add(routePointRealm); 
     realm.copyToRealmOrUpdate(routeRealm); 

     realm.commitTransaction(); 
    } 

И в RoutePointRealm выглядит следующим образом:

public class RoutePointRealm extends RealmObject { 

    @PrimaryKey 
    private long  routePointID; 
    private float  longitude, latitude; 
    private long  routepointTime; 
    private String address; 

    public long getRoutePointID() { 
     return routePointID; 
    } 

    public void setRoutePointID(long routePointID) { 
     this.routePointID = routePointID; 
    } 

    public float getLongitude() { 
     return longitude; 
    } 

    public void setLongitude(float longitude) { 
     this.longitude = longitude; 
    } 

    public float getLatitude() { 
     return latitude; 
    } 

    public void setLatitude(float latitude) { 
     this.latitude = latitude; 
    } 

    public long getRoutepointTime() { 
     return routepointTime; 
    } 

    public void setRoutepointTime(long routepointTime) { 
     this.routepointTime = routepointTime; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 
} 

По какой-то причине, RoutePointRealm добавляются в список, но все его поля устанавливаются в ноль и нуль. Я отлаживал свое приложение, чтобы убедиться, что все параметры содержат правильные значения с правильными типами данных и т. Д. Поэтому теперь я знаю, что проблема связана с методами Realm.

Надеюсь, кто-то может понять, что случилось. Любая помощь будет оценена.

ответ

1

Прежде всего, спасибо за ваши ответы! Я все еще не мог заставить его работать после изменения предлагаемых вами решений. По крайней мере, я так не думал.

Причина, по которой я думал, что это не сработало, было частично из-за ошибки, которую я сделал с моим gui, показывающим нулевое значение. Это заставило меня отлаживать приложение, но, видимо, отладчик всегда показывает нуль или null значения для объектов Realm. По крайней мере, в моем случае. Итак, я попытался сделать сообщение Toast с приносимым значением из Realm, и он вернул то, что он должен был.

Так что я не думаю, что с самого начала возникли проблемы. Отладчик просто заставил меня так думать. Мне жаль, если я потратил впустую ваше время, но я все же думал, что должен опубликовать это как ответ, если другие столкнутся с одной и той же проблемой.

0

Все ваши объекты находятся в ведении Realm, поэтому вам не нужен звонок realm.copyToRealmOrUpdate(routeRealm);.

0

проблема возникает из-за ID, Realm не поддерживает поведение автоматического прироста, поэтому вы должны сделать это вручную. что-то вроде:

beginTransaction() 
foo.setId(value) 
commitTrasaction() 
0

Моя личная рекомендация:

public void insertNewRoute(final int routeId, final long routeDate) { 
    final RouteRealm routeRealm = new RouteRealm(); 
    realm.executeTransaction(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      routeRealm.setId(routeId); 
      routeRealm.setDate(routeDate); 
      realm.insertOrUpdate(routeRealm);  
     } 
    }); 
} 

public void insertNewRoutePoint(final int routeId, final String address, final float latitude, 
         final float longitude, final long routePointId, final long routePointTime) { 
    realm.executeTransaction(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      RouteRealm routeRealm = realm.where(RouteRealm.class).equalTo(RouteRealmFields.ID, routeId).findFirst(); 
      RoutePointRealm routePointRealm = new RoutePointRealm(); 
      routePointRealm.setAddress(address); 
      routePointRealm.setLatitude(latitude); 
      routePointRealm.setLongitude(longitude); 
      routePointRealm.setRoutePointID(routePointId); 
      routePointRealm.setRoutepointTime(routePointTime); 
      routePointRealm = realm.copyToRealmOrUpdate(routePointRealm); 
      routeRealm.getRoutePoints().add(routePointRealm); 
     } 
    }); 
} 
Смежные вопросы