2016-12-14 142 views
0

我正在嘗試獲得一項法案的總價格,該法案中有許多與coredata有關的項目。我正在努力理解檢索項目所需的謂詞語法,以便我可以訪問它們的價格。我不斷收到以下錯誤:匹配一對多關係的謂詞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)") 
    } 
} 

數據庫關係圖片:ItemBill

任何幫助將是巨大的,我確定它的一個簡單修復,但在語法在某處我的頭上。由於

+0

您的物品中是否有參考物品bill_Id?或者是與Item-> Bill相反的關係?您是否還嘗試過直接從bill對象訪問「items」對象,而不是使用謂詞使用另一個獲取請求? – Tushar

+0

嗨,物品有UUID但沒有帳單ID。但是物品與賬單有着反向關係。我將在問題中添加關係圖像。我不能通過調用'bill.items'來訪問項目,如果這就是你要求的,bill是一個NSManagedObject。 – Wazza

回答

1

直接的答案是,你應該使用的反比關係,bill,在您的謂詞:

let predicate = NSPredicate(format: "bill == %@", billObject) 

但是,還有一個更簡單的方式來實現自己的計算總價格的目標:

let total = billObject.valueForKeyPath("[email protected]") 
billObject.setValue(total, forKey:"total") 

不需要獲取請求,也不需要for循環遍歷項目:這兩行將實現相同。

+0

非常感謝。我想我現在更瞭解一些語法。也感謝重構! – Wazza