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)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Swift 数组插入和 removeAtIndex 操作行为不一致?

任何不一致的铸造?在可选绑定期间进入 Swift 中的协议

SWIFT - Coredata删除关系记录

【rocketmq客户端】订阅关系一致

Swift 协议一致性

多种协议的 Swift 类一致性(XCode 7、iOS 9、Swift 2.1)