领域多对一关系示例

时间:2018-12-05 12:37:06

标签: ios swift realm

根据docs,通过以下方式完成多对一关系:

假设A持有B的许多资产,而B与A的关系为

class B: Object {
   @objc dynamic var a: A? 
}

class A: Object {
   let bs = LinkingObjects(fromType: B.self, property: "a")
}

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

这组b.aa.bs现在有一项。它运作良好,但我无法附加到A的bs属性。我本质上想要的是像现在这样的链接对象,但我也希望能够以其他方式创建关系,如下所示:

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

基本上添加a.bs会将b.a设置为我们更改的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.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 :(得分:0)

您要在“歌曲”中设置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)
}

如果要将现有歌曲链接到另一张专辑(新专辑或现有专辑),请提取歌曲并致电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