在Swift

时间:2015-11-27 20:56:20

标签: ios swift core-data entity

我在从实体创建对象时遇到问题。我有两个课程CategoryProduct。这是他们的实施:

class Category: NSManagedObject {
}
extension Category {
    @NSManaged var name: String?
    @NSManaged var products: NSSet? 
}

class Product: NSManagedObject {
}

extension Product {
    @NSManaged var name: String?
    @NSManaged var price: Double
    @NSManaged var producer: String?
    @NSManaged var basketConnection: NSSet?
    @NSManaged var containedBy: Category?
}

它们之间存在关联,其中CategoryProduct表中作为属性之一。现在我想在这个表中添加一些数据。添加Category个没有问题,但我不知道如何将特定Category设置为Product。我必须使用Categories获取所有表,选择特定对象,并将其设置为Product属性,还是有其他方法可以执行此操作?我还没找到解决这个问题的任何教程,所以我不得不问这里。这是我编写的一些代码,用于找出解决方案(但它没有用)。

    let categories = ["One", "Two", "Three"];

    for cat in categories{
        let newCategory = Category(entity: categoryEntity!, insertIntoManagedObjectContext: ctx)
        newCategory.name = cat

        let newProduct = Product(entity: productEntity!, insertIntoManagedObjectContext: ctx)
        newProduct.name = "Test"
        newProduct.price = 10
        newProduct.producer = "Testowy"
        newProduct.containedBy = newCategory

    }

我的第二个问题是,如何选择特定的产品阵列,以获取特定的类别名称。这段代码应该有用吗?

request.predicate = NSPredicate(format: "containedBy.name == %@",arguments: [self.categories])

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

先保存

在将任何内容写入数据库之前,您需要保存上下文。

do { try context.save() } catch {}

正确的谓词

您的谓词正确启动,但使用了错误的参数。

NSPredicate(format: "containedBy.name = %@", aString)

多个类别的谓词需要一组Category个对象(可能是您之前需要获取的)。

NSPredicate(format: "containedBy in %@", categoryArray)

或者如果您的类别具有唯一名称,这也可以使用

NSPredicate(format: "containedBy.name in %@", namesArray)

其他建议

而不是productEntity!(这是强制解包并需要更多代码)我建议使用

let newCategory = NSEntityDescription.insertNewObjectForEntityForName(
    "Category", inManagedObjectContext: context)