Я попытаюсь объяснить мой сценарий как можно короче, я прочитал некоторые комментарии по Realm GitHub Repo об этой проблеме:Realm Swift IOS - Невозможно установить первичный ключ
, истекающий приложение из-за неперехваченное exception «RLMException», причина: «Невозможно установить свойство первичного ключа« id »на существующее значение« xxxxxxx ».
Вот мой вопрос:
Я получил два класса.
Назначение Модель класса
import Foundation
import RealmSwift
class Appointment: Object {
dynamic var id = 0
dynamic var user_id: String?
dynamic var profile_id: String?
let mainMeeting = List<Meeting>()
let meetingsWithOtherInfo = List<Meeting>()
override static func primaryKey() -> String? {
return "id"
}
}
Встреча Модель класса
import Foundation
import RealmSwift
class Meeting: Object {
dynamic var id = 0
dynamic var name: String?
dynamic var created_at: String?
// other info
dynamic var restaurant_venue: String?
override static func primaryKey() -> String? {
return "id"
}
}
Я Извлечение назначениях от моего сервера API как этот
for fetchedAppointment in allAppointmentsFromAlamofire {
let existingAppointment: Results<(Appointment)>! = realm.objects(Appointment).filter("id = \(fetchedAppointment["id"]!)")
let newAppointment: Appointment = Appointment()
newAppointment.id = fetchedAppointment["id"]! as! Int
....
// add data to Meeting connected to Appointment
let newMeeting = Meeting()
newMeeting.id = fetchedAppointment["meetings"]["id"]! as! Int
...
// update or add new entry
try! realm.write {
print("NEW APPOINTMENT: \(newAppointment)")
realm.add(newAppointment, update: existingAppointment.count == 0 ? false : true)
}
}
Ошибка возникает всякий раз, когда программа пытается обновить существующую запись в области - всякий раз, когда существующийAppointment равен 1. Обходной путь здесь, из того, что я прочитал из Github Realm, является удаление переопределить статические функции primaryKey() в Класс встречи.
Нет проблем, если я просто добавляю новые записи в Назначение, но опять же проблема возникает, если я буду обновлять, и проблема исчезнет, если я удалю primaryKey() в классе собрания ---- НО, на других экранах моего приложения, мне действительно нужно иметь этот primaryKey() в классе собрания.
Мое дикое предположение, что каждый раз, когда мне нужно обновлять записи в «Назначении», я должен также обновить собрание.
Итак, вопрос в том, почему это происходит? Верно ли мое дикое предположение? Любой другой способ решить это?
У вас там есть точка, я чувствую, что этот ответ правильный. Позвольте мне попробовать мое быстрое и грязное решение: оно есть, если existingAppointment.count! = 0, а затем удалить запись, а затем снова добавить запись.В этом случае я обновляю запись, но удаляя существующие. Если у вас есть лучший способ, пожалуйста, дайте мне знать. Спасибо! –