Сбой дублирования первичного ключа в области со связями - PullRequest
0 голосов
/ 12 декабря 2018

У меня вопрос об отношениях и о первичных ключах.Прежде всего, позвольте мне показать имеющиеся у меня Модели и как они связаны друг с другом:

  • Исполнитель
    • 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
}

Вопрос: Нужно ли добавлять сам альбом в область?Или он будет добавлен в Царство автоматически, когда я добавлю его в моего художника?

С этим вопросом связан мой второй вопрос.Вот мой код импорта:

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 вцарство?

Спасибо

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