我有两个对象: Category
和 Item
. Item
具有 name
字段, price
字段和 quantity
字段 . Category
有一个 name
字段 . 一个类别也有很多 Items
. 当我访问我的tableView of categories
时,我希望显示与 category
相关的所有 items
. 下面是我在添加新的 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)")
}
}
1 回答
因为
item
关系是category
关系的反转,所以您不需要同时设置它们 . 如果您以一种方式设置关系,Core Data会自动执行另一种方式:所以不需要以下几行......
你的谓词在获取中也是错误的 - 不需要在谓词中使用
name
属性 - CoreData将(在引擎盖下)使用自己的主键 . 所以修改一下:对此: