我有两个对象:Category
和Item
。 Item
有一个name
字段,price
字段和quantity
字段。 Category
有一个name
字段。一个类别也有很多Items
。当我访问categories
的tableView时,我想显示与该items
相关的所有category
。以下是我在添加新Item
时以及在提取category
以显示其所有项目时如何设置关系的代码。我没有正确保存这段关系吗?
func saveItem(name: String, quantity: Int, price: String) {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
let entity = NSEntityDescription.entityForName("Item", inManagedObjectContext: managedContext)
let item = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext)
var error: NSError?
item.setValue(name, forKey: "name")
item.setValue(quantity, forKey: "quantity")
item.setValue(price, forKey: "price")
item.setValue(selectedCategory, forKey: "category")
// selectedCategory: the parent of this new item
selectedCategory.setValue(NSOrderedSet(object: item), forKey: "item")
if !managedContext.save(&error) {
println("Could not save \(error), \(error?.userInfo)")
}
else {
items.append(item)
self.fetchCategories("")
}
}
func fetchItems() {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
let fetchRequest = NSFetchRequest(entityName: "Item")
fetchRequest.sortDescriptors = [sortDescriptor]
fetchRequest.predicate = NSPredicate(format: "category = %@", category?.valueForKey("name") as! String)
var error: NSError?
let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as? [NSManagedObject]
if let results = fetchedResults {
items = results
}
else {
println("Could not fetch \(error), \(error!.userInfo)")
}
}
答案 0 :(得分:1)
由于item
关系是category
关系的反转,因此您无需同时设置它们。如果您以一种方式设置关系,Core Data会自动执行另一种方式:
item.setValue(selectedCategory, forKey: "category")
所以不需要以下几行......
// selectedCategory: the parent of this new item
selectedCategory.setValue(NSOrderedSet(object: item), forKey: "item")
此外,您的谓词在获取中是错误的 - 不需要在谓词中使用name
属性 - CoreData将(在引擎盖下)使用自己的主键。所以修改一下:
fetchRequest.predicate = NSPredicate(format: "category = %@", category?.valueForKey("name") as! String)
到此:
fetchRequest.predicate = NSPredicate(format: "category = %@", category!)