Realm Swift iOS - 无法设置主键

时间:2016-06-29 06:19:27

标签: ios swift realm

我会尝试尽可能简短地解释我的场景,我已经阅读了有关此问题的Realm GitHub Repo的一些评论:

  

由于未捕获的异常终止应用' 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)
    }
}

每当程序尝试更新现有条目时都会出现错误 - 只要现有的约会为1.此处的解决方法,我从Github Realm读取的内容是删除覆盖静态函数会议等级中的primaryKey()

如果我只是向Appointment添加新条目,则没有问题,但是如果我要更新则会出现问题,如果我在Meeting Class中删除了primaryKey(),问题就会消失---- BUT ,在我的应用程序的其他屏幕中,我真的需要在Meeting Class中使用primaryKey()。

我的猜测是,每次我需要更新约会中的条目时,我都应该更新会议。

所以,问题是:为什么会发生这种情况?我的猜测是否正确?还有其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

如果您提供新对象,则不需要将$httpProvider.interceptors.push(function($rootScope) { return { responseError: function(rejection) { //...some custom data checking console.log('error #1'); throw rejection; } }; }); 的更新参数设置为add(:_, update: _)。如果您的模型具有主键并且您想要创建或更新,则可以传递false,并且Realm将自动确定是否已在数据库中管理具有相同主键的对象。