我正在挠头,因为几个小时后我仍然无法理解这一点。
我的核心数据模型中有2个实体:
我已经将关系定义为一对多并且相反。 (是的,你已经拥有它,一个城镇可以有多家餐馆;)
我正在使用Core Data Stack来保存来自CloudKit和AlecrimCoreData库的元素。在从CloudKit获取内容的类中,我通过Alecrim创建了上下文:
let dataContext = DataContext()
然后我有一堆函数调用类函数来创建NSManagedObjects,如果需要的话
let town = Towns.createTownsFromCK(record, dataContext: self.dataContext) ...
let restaurant = Restaurants.createRestaurantFromCK(record, dataContext: self.dataContext) ...
如您所见,我将dataContext传递给每个调用,因此对于餐馆和城镇来说也是如此。在城镇本地保存后,CloudKit餐馆对象被抓住。
try dataContext.save()
let restaurantPredicate = NSPredicate(format: "town == %@", record.recordID)
let restaurantQuery = CKQuery(recordType: "Restaurants", predicate: restaurantPredicate)
self.publicDB.addOperation(createQueryOperation(restaurantQuery, cursor: nil, resultblock:fetchedRestaurantsRecord))
当抓住时,我可以创建餐厅NSManagedObjects并添加属性,但是当我想要链接城镇时,我在设置城镇时遇到一个奇怪的错误:
if let cktownreference = record["town"] as? CKReference,
town = dataContext.towns.filter{ $0.ckid! == cktownreference.recordID.recordName }.first {
restaurant.town = town
}
错误:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'对于一对一关系的值不可接受的类型:property =“town”; 期望的类型=城镇;给定类型=城镇; value =(entity:Towns; id:0xd000000000080000; data:{ ckid =“6665ca0f-af57-4305-8e18-ced7540e6279”; name = Paris; recordChangeTag = ii0l38hp; restaurant =“”; })'
我试图创建一个新的上下文,我试图将Town设置为NSSet
,结果相同。
这是我的餐厅架构:
和镇:
我每个人都遇到同样的问题:我有很多链接。