CoreData 关系不一致(Swift)
Posted
技术标签:
【中文标题】CoreData 关系不一致(Swift)【英文标题】:CoreData relationship not consistent (Swift) 【发布时间】:2015-10-24 20:48:13 【问题描述】:我遇到了一个问题,我有一组 CoreData 对象,如下所示:
组织 > 客户 > 订单 > ordersku
其中每个关系都是一对多的。
在订购屏幕上,这适用于以下情况:
打印(order.customer.getJSON()) - (客户包括其包含订单的 JSON)
[
"id": 300,
"orders": (
customer_id = 300;
deliverydate = "<null>";
id = "-681F71DDA4B5413782A6150C10F7A314";
skus = (
code = "CC1";
id = "-4B5C1EE9DB8745A8963F6167C6DAA4F3";
,
code = "CC2";
id = "-B3FB1A7F13334351AF9D85D9150730A1";
);
),
]
但是,如果我在将一个对象深入到关系中时尝试相同:
打印(order.customer.organisation.customers().first!.getJSON()) - (组织只有一个客户)
[
"id": 300,
"orders": (),
]
我根本没有收到任何订单。当我尝试为下线的客户生成 JSON 时,这被证明是有问题的。
这两个请求在彼此之后直接执行,这意味着模型的状态不应该在它们之间发生变化。
let cus1 = order.customer
print("== \(cus1.getJSON())")
let cus2 = order.customer.organisation.customers().first!
print("== \(cus2.getJSON())")
if cus1 == cus2
print("MATCHED")
else
print("UNMATCHED")
尽管 ID 相同,或者在概念上指的是相同且唯一的客户,但它会导致“不匹配”。
如果有帮助,下面是我在组织中使用的 customers() 方法的代码,它只是指关系而不是尝试从上下文中检索对象。
func customers() -> [Customer]
var customers = relatedcustomers.allObjects as! [Customer]
return customers
【问题讨论】:
您是否以某种方式在代码中创建了同一客户的两个单独实例?如果是这样,使用if cus1.objectID = cus2.objectID
之类的东西可能会更安全,假设它们是NSManagedObjects
。
【参考方案1】:
首先,您可能不止一次地创建了同一个客户。您可以将订单添加到一个实例,但不能添加到另一个实例。 first
只会从NSSet
中检索没有定义顺序的任何一个(对于数组,这将取决于排序键)。
其次,您对customers()
的呼叫不熟悉。在 Core Data 中,您将获得与 customers
关系的 NSSet
。如果您的 NSManagedObject
子类中有自定义函数,您可能希望将其重命名为与关系名称不同的名称。
【讨论】:
以上是关于CoreData 关系不一致(Swift)的主要内容,如果未能解决你的问题,请参考以下文章