按关系过滤核心数据对象

时间:2015-06-09 19:43:42

标签: ios swift core-data one-to-many entity-relationship

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

我的数据模型

enter image description here enter image description here

1 个答案:

答案 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!)