在访问核心数据中的子对象时获取关系错误

时间:2017-07-25 09:43:47

标签: ios swift core-data

我有两个核心数据实体ContactGroup。群组有existingUsersnonExistingUsers两个属性Contact和多种关系

我正在尝试使用groupId作为谓词来获取组属性。这就是我获取组详细信息的方式

let requestForGroups = NSFetchRequest<NSFetchRequestResult>(entityName: "Group")
    requestForGroups.returnsObjectsAsFaults = false
    requestForGroups.predicate = NSPredicate(format: "groupId == %@", (groupObject?.groupId)!)
    requestForGroups.relationshipKeyPathsForPrefetching = ["existingUsers", "nonExistingUsers"]
    do {
        let results = try managedObjectContext.fetch(requestForGroups) as! [Group]
        if results.count > 0 {
            print(results.first)
            var group: Group!
            group = results.first
            for users in group.existingUsers?.allObjects as! [Contact] {
                print(users)
            }
            for users in group.nonExistingUsers?.allObjects as! [Contact] {
                print(users)
            }
        }
    } catch let error as NSError {
        print("Error: \(error) " +
            "description \(error.localizedDescription)")
}

当我尝试打印Group对象时,我得到以下关系错误

Optional(<Foodvite.Group: 0x1706801e0> (entity: Group; id: 0xd0000000018c0000 <x-coredata://E4C6CB69-7192-435C-9E2A-534FCFC563F5/Group/p99> ; data: {
existingUsers = "<relationship fault: 0x17063b620 'existingUsers'>";
groupCategory = nil;
groupIconUrl = nil;
groupId = "8ba3e576-edf7-41fa-abd9-df80c4c693f2";
groupName = Friends;
groupOwnerId = "7fa49a4e-2cbf-4c77-8868-bc97ad89881b";
nonExistingUsers = "<relationship fault: 0x17063b600 'nonExistingUsers'>";
}))

有人可以建议一种方法来访问existingUsersnonExistingUsers数据吗?

2 个答案:

答案 0 :(得分:0)

这是正确的,因为Coredata关系默认是懒惰加载的。

以下是Apple documentation

  

托管对象通常表示持久性存储中保存的数据。   在某些情况下,托管对象可能是一个错误 - 一个对象   尚未从外部数据存储加载属性值。   错误会减少应用程序消耗的内存量。

要访问existingUsersnonExistingUsers数据,您需要明确询问(如果它们不是数组):

print(group!.existingUsers.<attributeName>)
print(group!.nonExistingUsers.<attributeName>)

如果您的关系是阵列:

if let first = group?.existingUsers.first {
    print(first.<attributeName>)
}

阅读this以便更好地理解。

答案 1 :(得分:0)

故障不是错误。这是一个性能考虑因素,除非您确实需要,否则不会加载来自持久性存储的数据。对于具有表示与潜在数千其他实体的多对多关系的属性的获取对象尤其如此。如果你甚至不打算使用它们,那么在内存中加载数千个其他对象会很愚蠢。

在您的情况下,existingUsersnonExistingUsers可能都是NSSets。您可以像这样访问其中的元素:

//assuming "group" is an NSManagedObject

for user in group.existingUsers! {
    user.property = someValue
    if user.otherProperty == ...
}

在访问user集合中的每个existingUsers时,NSManagedObjectContext将使用从持久性存储中检索的值自动填充对象的属性。简而言之,当您访问或分配它们时,将正确返回/设置每个user属性的预期值。