我对关系和主键有疑问。 首先,让我展示一下我拥有的模型以及它们之间的关系:
let albums = List<Album>()
let artists = LinkingObjects(fromType: Artist.self, property: "albums")
意味着一位艺术家有几张专辑,而一张专辑可以有几位歌手。
关于关系的第一个问题是:
// create the realm
let realm: Realm = try! Realm()
// create the artist
let artist: Artist = Artist()
realm.write {
realm.add(artist)
}
// creating the album
let album: Album = Album()
realm.write {
artist.albums.append(album) // appending album
}
问题:我需要将专辑本身添加到领域吗?还是当我将其添加到我的艺术家时会自动添加到Realm?
与这个问题有关的是我的第二个问题。 这是我的导入代码:
let createdAlbums: [Album] = [...] // let's assume it is not empty, but all objects in there are in memory
let newAlbums = createdAlbums.filter({ (createdAlbum: Album) -> Bool in
if let album = AlbumManager.object(for: createdAlbum.identifier) {
if !artist.albums.contains(album) {
appendingAlbums.append(album)
}
return false
}
return true
})
这是AlbumManager.object(for: createdAlbum.identifier)
static func object(for identifier: String) -> ModelObject? {
return DatabaseManager.shared.getObject(of: ModelObject.self, for: identifier)
}
// DatabaseManager
public func getObject<Element: Object, KeyType>(of type: Element.Type, for key: KeyType) -> Element? {
return self.realm.object(ofType: type, forPrimaryKey: key)
}
从本质上讲,我检查领域中是否已经存储有专辑。如果是这样,它将不在newAlbums
中。
但是,如果该艺术家不包含专辑(这意味着另一位艺术家已经添加了此专辑,并且该艺术家是其中的一部分,本质上是多位艺术家),则将其添加到“要添加到该艺术家专辑”中。>
问题:我的应用因'Attempting to create an object of type 'Album' with an existing primary key value '1256125521'.'
崩溃
我对newArtist
和appendingAlbums
进行以下操作:
realm.write {
artist.albums.append(objectsIn: appendingAlbums)
artist.albums.append(objectsIn: newAlbums)
}
现在,这与第一个问题有关。 appendingAlbums
确实包含已经存在的相册(因此,我不想将其添加到领域中,因为它会崩溃)。
newAlbums
包含新专辑,我想将它们写到领域。
那么如何将艺术家链接到appendingAlbums
和newAlbums
中的专辑,却只将newAlbums
写入领域?
谢谢