Пример отношений «многие к одному» - PullRequest
0 голосов
/ 05 декабря 2018

Согласно документам , отношение «многие к одному» выполняется следующим образом:

Предполагается, что A удерживает многие из B, а B имеет одно отношение к A

* 1006.*

У этого набора b.a и a.bs теперь есть один предмет.Это работает хорошо, но я не могу добавить к свойству bs.По сути, я хочу, чтобы связанный объект был таким, каким он является сейчас, но я также хочу иметь возможность создавать отношения наоборот:

let a = A()
let b = B()
a.bs.append(b)

По существу, добавление a.bs установит ba в этот aчто мы меняемся.Можно ли как-нибудь связать такие свойства?

Пример

Предположим, у нас есть альбом, а в альбоме есть песни.В одном альбоме много песен, но у одной песни только один альбом.

class Album : Object {
  let songs = LinkingObjects(fromType: Song.self, property: "album")
}

class Song : Object {
  @objc dynamic var album: Album?
}

Настройка song.album = album работает хорошо, и песни добавляются в album.songs, однако добавление album.songs.append(song) не работает.

Есть идеи, как мне это решить?Потому что в следующем сценарии:

class Album : Object {
  let songs = List<Song>()
}

class Song : Object {
  @objc dynamic var album: Album?
}

Установка song.album = album не добавит песню в список песен.Однако в этом случае я могу добавить album.songs, но это также не установит отношения song.album

Любая помощь приветствуется

1 Ответ

0 голосов
/ 05 декабря 2018

Вы хотите настроить свойство LinkingObjects в «Песне».

class Album : Object {
  @objc dynamic var name = ""
  let songs = List<Song>()
}

class Song : Object {
  @objc dynamic var name = ""
  let album = LinkingObjects(fromType: Album.self, property: "songs")
}

Затем вы можете создать альбом и добавить песню.

let album = Album()
album.name = "album1"
let song = Song()
song.name = "song1"
album.songs.append(song)

try! realm.write {
    realm.add(album)
}

Если вы хотите связать существующую песню с другим альбомом (новым или существующим), выберите песню иcall album.songs.append(fetchedSong).

Что касается комментария о "списке альбомов", LinkingObjects является массивом.Например, вы можете связать песню с именем «song1» с «album1» и «album10».Если вы позвоните print(song1.album), вы получите что-то вроде этого.

LinkingObjects<Album> <0x7fd5c440ef10> (
[0] Album {
    name = album1;
    songs = List<Song> <0x600001b1c000> (
        [0] Song {
            name = song1;
        }
    );
},
[1] Album {
    name = album10;
    songs = List<Song> <0x600001b1c090> (
        [0] Song {
            name = song1;
        }
    );
}

)

Вы можете узнать о LinkingObjects и обратных отношениях здесь: https://realm.io/docs/swift/latest/#inverse-relationships

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...