根据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.a
和a.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
任何帮助表示赞赏
答案 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