首页 文章

按关系过滤核心数据对象

提问于
浏览
1

我有两个对象: CategoryItem . 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)")
    }
}

我的数据模型

enter image description here

enter image description here

1 回答

  • 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!)
    

相关问题