在 Swift 中从 Core Data 设置实体对象
Setting entity object from Core Data in Swift
我在从实体创建对象时遇到问题。我有两个 类 Category
和 Product
。这是它们的实现:
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?
}
它们之间是有关系的,其中Category
在Product
table中作为属性之一。现在我想向这个 tables 添加一些数据。添加Category
是没有问题的,但是我不知道,如何设置具体的Category
到Product
。我必须使用 Categories
、select 特定对象获取所有 table,并将其设置为 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
}
我的第二个问题是,如何 select 特定的产品数组,用于特定的类别名称。这段代码应该工作吗?
request.predicate = NSPredicate(format: "containedBy.name == %@",arguments: [self.categories])
感谢您的帮助!
先保存
您需要在将任何内容写入数据库之前保存上下文。
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)
我在从实体创建对象时遇到问题。我有两个 类 Category
和 Product
。这是它们的实现:
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?
}
它们之间是有关系的,其中Category
在Product
table中作为属性之一。现在我想向这个 tables 添加一些数据。添加Category
是没有问题的,但是我不知道,如何设置具体的Category
到Product
。我必须使用 Categories
、select 特定对象获取所有 table,并将其设置为 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
}
我的第二个问题是,如何 select 特定的产品数组,用于特定的类别名称。这段代码应该工作吗?
request.predicate = NSPredicate(format: "containedBy.name == %@",arguments: [self.categories])
感谢您的帮助!
先保存
您需要在将任何内容写入数据库之前保存上下文。
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)