Царство отношения один ко многим не сохранилось - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь реализовать Many-to-many relationship с Realm между User и Chat объектами. Я следую официальной документации . Вот мои объекты.

 public class User implements RealmModel {

  @PrimaryKey
  private String userId;
  private String name;
  private String phone;
  private String pictureURL;
  private String thumbnailURL;
  private String pushToken;
  private String status;
  private long lastOnlineMs;
  public RealmList<Chat> chats = new RealmList<>();

  public User() {}

}  

public class Chat implements RealmModel {

  @Required
  @PrimaryKey
  private String chatId;
  private long creationDateMs;
  private String creatorUserId;
  private String name;

  @LinkingObjects("chats")
  public final RealmResults<User> users = null;

  private int chatType;


  public Chat() {}
 }

Вот код, в котором я создаю объект Chat в базе данных и добавляю отношение. Пользователи были правильно созданы до:

public void addChat(final Chat chat, final User creatorUser, final User opponentUser ) {
    realm.executeTransaction(realm -> {
        realm.copyToRealmOrUpdate(chat);

        creatorUser.chats.add(chat);
        opponentUser.chats.add(chat);
    });
}

После выполнения кода User и Chat объекты сохраняются в базе данных, но chat list для пользователей пусты.

Я также использую realm.beginTransaction, который аналогичен executeTransaction, разница только в том, что выполнять потокобезопасно.

Я также использую realm.insertOrUpdate(obj), но просто получаю тот же результат.

1 Ответ

0 голосов
/ 11 января 2019

copyToRealmOrUpdate из документа:

Обновляет существующий объект RealmObject, идентифицируемый тем же {@link io.realm.annotations.PrimaryKey} или новой копией, если существующий объект не может быть найден

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

public void addChat(final Chat chat, final User creatorUser, final User opponentUser ) {
    realm.executeTransaction(realm -> {
        Chat managedChat = realm.copyToRealmOrUpdate(chat);
        creatorUser.chats.add(managedChat);
        opponentUser.chats.add(managedChat);
    });
}
...