谓词匹配一对多关系核心数据
Posted
技术标签:
【中文标题】谓词匹配一对多关系核心数据【英文标题】:Predicate matching one to many relationship coredata 【发布时间】:2016-12-14 14:20:52 【问题描述】:我正在尝试获取在 coredata 中有许多与之相关的项目的账单的总价格。我正在努力理解检索项目所需的谓词语法,以便我可以访问它们的价格。我不断收到以下错误:
2016-12-14 14:13:12.309 Splitter[43533:5597917] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unimplemented SQL generation for predicate : (ANY items IN <Splitter.Bill: 0x7fe6e0cebbd0> (entity: Bill; id: 0xd000000000300000 <x-coredata://D13BAFFD-A78A-4C49-9992-F975887B7AB7/Bill/p12> ; data:
date = "December 14, 2016";
id = "6D672183-44C2-4961-ABB6-27FD657E5C68";
items = (
"0xd000000001fc0012 <x-coredata://D13BAFFD-A78A-4C49-9992-F975887B7AB7/Item/p127>",
"0xd0000000020c0012 <x-coredata://D13BAFFD-A78A-4C49-9992-F975887B7AB7/Item/p131>",
"0xd000000002080012 <x-coredata://D13BAFFD-A78A-4C49-9992-F975887B7AB7/Item/p130>",
"0xd000000002100012 <x-coredata://D13BAFFD-A78A-4C49-9992-F975887B7AB7/Item/p132>",
"0xd000000002040012 <x-coredata://D13BAFFD-A78A-4C49-9992-F975887B7AB7/Item/p129>",
"0xd000000001f00012 <x-coredata://D13BAFFD-A78A-4C49-9992-F975887B7AB7/Item/p124>",
"0xd000000001f80012 <x-coredata://D13BAFFD-A78A-4C49-9992-F975887B7AB7/Item/p126>",
"0xd000000001e80012 <x-coredata://D13BAFFD-A78A-4C49-9992-F975887B7AB7/Item/p122>",
"0xd000000001f40012 <x-coredata://D13BAFFD-A78A-4C49-9992-F975887B7AB7/Item/p125>",
"0xd000000001ec0012 <x-coredata://D13BAFFD-A78A-4C49-9992-F975887B7AB7/Item/p123>",
"(...and 1 more...)"
);
location = hgfhgfd;
name = hgfhgfd;
total = 0;
))'
来自以下代码:
func setBillTotal()
let managedContext = billObject.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "Item")
let predicate = NSPredicate(format: "ANY items IN %@", billObject)
fetchRequest.predicate = predicate
var items = [Item]()
do
let results =
try managedContext!.executeFetchRequest(fetchRequest)
items = results as! [Item]
catch let error as NSError
print("Could not fetch \(error), \(error.userInfo)")
var sum = Int(0.0)
for item in items
sum += Int(item.price)
billObject.setValue(sum, forKey: "total")
do
try managedContext!.save()
catch let error as NSError
print("Could not save \(error), \(error.userInfo)")
数据库关系图片:
任何帮助都会很棒,我确信它是一个简单的修复,但语法在某个地方超出了我的头脑。谢谢
【问题讨论】:
您的 Item 中有参考 bill_Id 吗?还是来自 Item->Bill 的反比关系?您是否也尝试过直接从账单对象访问“项目”对象,而不是使用谓词使用另一个获取请求? 您好,商品有 UUID,但没有账单 ID。但是Items确实与bill有反比关系。我将在问题中添加关系的图像。如果这就是您的要求,我无法通过调用“bill.items”来访问项目,bill 是一个 NSManagedObject。 【参考方案1】:直接的答案是您应该在谓词中使用逆关系bill
:
let predicate = NSPredicate(format: "bill == %@", billObject)
但是,有一种更简单的方法可以实现计算总价的目标:
let total = billObject.valueForKeyPath("items.@sum.price")
billObject.setValue(total, forKey:"total")
不需要获取请求,也不需要 for 循环遍历项目:这两行将实现相同的效果。
【讨论】:
非常感谢。我想我现在对语法有了更多的了解。也感谢重构! 注意,对于多对多,请查看:***.com/a/2543208/294884以上是关于谓词匹配一对多关系核心数据的主要内容,如果未能解决你的问题,请参考以下文章