2017-02-16 3 views
0

Я Parent и Child класс:Realm андроид один ко многим - cannont выборки детей от родителей

public class Parent extends RealmObject { 
    private String name; 
    private RealmList<Child> children; 

    public String getName() { 
     return name; 
    } 

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

    public RealmList<Child> getChildren() { 
     return children; 
    } 

    @Override 
    public String toString() { 
     return this.name; 
    } 
} 


public class Child extends RealmObject { 
    private String name; 
    private Parent parent; 


    public String getName() { 
     return name; 
    } 

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

    public Parent getParent() { 
     return parent; 
    } 

    public void setParent(Parent parent) { 
     this.parent = parent; 
    } 

    @Override 
    public String toString() { 
     return this.name; 
    } 
} 

Теперь я создаю пример данных:

realm.beginTransaction(); 
    realm.deleteAll(); 

    Child child1 = realm.createObject(Child.class); 
    child1.setName("Bart"); 

    Child child2 = realm.createObject(Child.class); 
    child2.setName("Lisa"); 

    Child child3 = realm.createObject(Child.class); 
    child3.setName("Maggie"); 

    Parent parent = realm.createObject(Parent.class); 
    parent.setName("Homer"); 

    child1.setParent(parent); 
    child2.setParent(parent); 
    child3.setParent(parent); 

    realm.commitTransaction(); 

Почему я не получаю детей, когда так спрашивать?

Parent homer = realm.where(Parent.class).findFirst(); 
    for(Child child : homer.getChildren()) { 
     System.out.println(child.toString()); 
    } 

Это работает, когда я задаю ребенок к родителю с помощью parent.getChildren().add(child). Но это не работает, когда я назначаю родителям детям (например, child.setParent(parent)). Что я здесь делаю неправильно?

+0

Вы не сделали ничего плохого. С текущим Realm ('v2.3.1') вы должны вызвать' parent.getChildren(). Add (child) 'для вашего прецедента. Но мы реализуем функцию под названием «обратные ссылки», которая упростит ваш вариант использования. См. Https://github.com/realm/realm-java/issues/607 – beeender

ответ

2

Это не работает, потому что, хотя вы устанавливаете родительский элемент для дочернего элемента, в родительском объекте отсутствует ссылка на соответствующий список дочерних объектов («родитель не знает, что теперь есть кто-то, кто звонит ему их родителей "). Я не уверен, что даже возможно иметь двунаправленную связь между такими объектами в Царстве.

В зависимости от того, что вы хотите достичь, вы можете попробовать запрашивая для детей:

Child child = realm.where(Child.class).equalTo("parent.name","homer").findAll(); 
0

Потому что вам нужно, чтобы добавить детей родительских связей.

Установка ссылки для детей на родителя - это совершенно независимая вещь из ссылки в родительском для детей.

realm.beginTransaction(); 
realm.deleteAll(); 

Child child1 = realm.createObject(Child.class); 
child1.setName("Bart"); 

Child child2 = realm.createObject(Child.class); 
child2.setName("Lisa"); 

Child child3 = realm.createObject(Child.class); 
child3.setName("Maggie"); 

Parent parent = realm.createObject(Parent.class); 
parent.setName("Homer"); 

child1.setParent(parent); 
child2.setParent(parent); 
child3.setParent(parent); 

parent.getChildren().add(child1); 
parent.getChildren().add(child2); 
parent.getChildren().add(child3); 

realm.commitTransaction(); 
Смежные вопросы