我会尝试尽可能简短地解释我的场景,我已经阅读了有关此问题的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()。
我的猜测是,每次我需要更新约会中的条目时,我都应该更新会议。
所以,问题是:为什么会发生这种情况?我的猜测是否正确?还有其他方法可以解决这个问题吗?
答案 0 :(得分:0)
看起来您正在尝试使用不是其主键的值更新newAppointment对象。
realm.add(newAppointment, update: existingAppointment.count == 0 ? false : true)
相反,Realm期望您提供该对象的密钥,以便它可以更新指定的对象。
看起来您在此处设置了键值,这是您应该用于更新的内容。
let newAppointment: Appointment = Appointment()
newAppointment.id = fetchedAppointment["id"]! as! Int
答案 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将自动确定是否已在数据库中管理具有相同主键的对象。