2

我在挠头,因为几个小时后我仍然无法理解这一点。

我的核心数据模型中有 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'而终止应用程序,原因:'一对一关系的值类型不可接受:属性=“城镇”;所需类型=城镇;给定类型=城镇;价值=(实体:城镇;ID:0xd000000000080000;数据:{ckid =“6665ca0f-af57-4305-8e18-ced7540e6279”;名称=巴黎;recordChangeTag = ii0l38hp;餐厅=“”;})。

我试图创建一个新的上下文,我试图将 Town 设置为NSSet相同的结果。

这是我的餐厅模式:

餐厅模式与关系

和镇:

城镇模型与关系

我每个人都有同样的问题:我有很多链接。

4

0 回答 0