2016-06-29 2 views
2

Я попытаюсь объяснить мой сценарий как можно короче, я прочитал некоторые комментарии по 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() в классе собрания.

Мое дикое предположение, что каждый раз, когда мне нужно обновлять записи в «Назначении», я должен также обновить собрание.

Итак, вопрос в том, почему это происходит? Верно ли мое дикое предположение? Любой другой способ решить это?

ответ

0

Похоже, вы пытаетесь обновить объект newAppointment со значением, которое не является его первичным ключом.

realm.add(newAppointment, update: existingAppointment.count == 0 ? false : true) 

Вместо этого Realm ожидает, что вы предоставите ключ для этого объекта, чтобы он мог обновить указанный объект.

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

let newAppointment: Appointment = Appointment() 
newAppointment.id = fetchedAppointment["id"]! as! Int 

Realm documentation on updating with keys.

+0

У вас там есть точка, я чувствую, что этот ответ правильный. Позвольте мне попробовать мое быстрое и грязное решение: оно есть, если existingAppointment.count! = 0, а затем удалить запись, а затем снова добавить запись.В этом случае я обновляю запись, но удаляя существующие. Если у вас есть лучший способ, пожалуйста, дайте мне знать. Спасибо! –

0

Вам не нужно устанавливать обновления аргумент add(:_, update: _) в false, если вы предоставите новый объект. Если ваша модель имеет первичный ключ и вы хотите создать или обновить, вы можете пройти true, и Realm автоматически определит, уже ли управляется объект с тем же самым первичным ключом в базе данных.

+0

Я понимаю все это. Я уже решил проблему, поместив грязное обходное решение: удалите функцию primaryKey() в моей модели Meeting, и я удаляю записи, если мне нужно обновить. Поэтому я обновляю: удаление и повторное добавление. Я хотел бы знать, как правильно обновлять «Назначение и списки встреч». –

Смежные вопросы