我有两个核心数据实体Contact
和Group
。群组有existingUsers
和nonExistingUsers
两个属性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'>";
}))
有人可以建议一种方法来访问existingUsers
和nonExistingUsers
数据吗?
答案 0 :(得分:0)
这是正确的,因为Coredata关系默认是懒惰加载的。
以下是Apple documentation。
托管对象通常表示持久性存储中保存的数据。 在某些情况下,托管对象可能是一个错误 - 一个对象 尚未从外部数据存储加载属性值。 错误会减少应用程序消耗的内存量。
要访问existingUsers
和nonExistingUsers
数据,您需要明确询问(如果它们不是数组):
print(group!.existingUsers.<attributeName>)
print(group!.nonExistingUsers.<attributeName>)
如果您的关系是阵列:
if let first = group?.existingUsers.first {
print(first.<attributeName>)
}
阅读this以便更好地理解。
答案 1 :(得分:0)
故障不是错误。这是一个性能考虑因素,除非您确实需要,否则不会加载来自持久性存储的数据。对于具有表示与潜在数千其他实体的多对多关系的属性的获取对象尤其如此。如果你甚至不打算使用它们,那么在内存中加载数千个其他对象会很愚蠢。
在您的情况下,existingUsers
和nonExistingUsers
可能都是NSSets。您可以像这样访问其中的元素:
//assuming "group" is an NSManagedObject
for user in group.existingUsers! {
user.property = someValue
if user.otherProperty == ...
}
在访问user
集合中的每个existingUsers
时,NSManagedObjectContext将使用从持久性存储中检索的值自动填充对象的属性。简而言之,当您访问或分配它们时,将正确返回/设置每个user
属性的预期值。