我试图理解在CoreData中的一对多关系实体中保存和检索记录的概念。我有两个表产品(主)和销售(细节)因此(一对多)关系密钥是(销售)。
问题1:在向产品注册销售时。我创建Sales实体的实例,填充值,然后将其添加到product.sales(relationship)并尝试managedObjectContext保存。
第一个问题:我是否还必须将Sales实体的实例输入销售实体?或者由于存在关系而自动更新?
第二个问题:如果我想查询到目前为止发生的所有销售,我是否会查询销售实体?或者我是否在产品实体中查询关系?
感谢您的帮助!
答案 0 :(得分:1)
第一个问题:我是否还必须将Sales实体的实例输入销售实体?或者由于存在关系而自动更新?
您可能没有意识到的是,您通过将对象添加到managedObjectContext
来固有地保存对象。一旦你做了像
let sale = Sale(context: managedObjectContext)
接着是
managedObjectContext.save()
上下文向持久性存储(实际的SQL数据库)发出保存请求。
因此,您是否需要存储销售的问题得到了解答,它将始终在保存上下文时存储。
第二个问题:如果我想查询到目前为止发生的所有销售,我是否会查询销售实体?或者我是否在产品实体中查询关系?
这取决于......
首先让我给你一点提示/最佳实践:
始终确保设置反向关系
在Product
实体关系的核心数据编辑器中,您可以执行以下操作:
您的销售关系如下所示:
关系只不过是两个实体之间的依赖关系,因此两个实体之间总是存在反向关系,请确保如上所示将它们连接起来。
为什么我这样告诉你?记得我提到它取决于你查询的实体是什么?这是重要的。
例如,如果您希望给定Sale
的{{1}},则可以查询产品本身(通过查询名为Product
的关系):
sale
如果您想要来自特定销售的所有产品,您可以使用let product = [A product instance from your Core Data store]
let sale = product.sale // returns the sale the product is associated to
关系查询Sale
实体:
products
您提到您想要所有销售到指定日期:
查询let sale = [A sale from your Core Data store]
let products = sale.products // the products contained in the sale
实体是没有任何意义的,因为每个产品只与它所包含的销售有关系。
因此,要回答您的问题,您应该查询Product
实体以检索指定日期的所有销售额。
我希望有所帮助,如果有什么不清楚,请告诉我。
答案 1 :(得分:1)
let manageObjectContext = appDelegateObj.managedObjectContext
let entity = NSEntityDescription.entityForName("", inManagedObjectContext:manageObjectContext)
let manageObj = NSManagedObject(entity: entity!,insertIntoManagedObjectContext: manageObjectContext)
manageObj.setValue("Mark Developer", forKey: "AttributeName")
do {
try manageObjectContext.save()
} catch let error as NSError {
print("Could not save \(error), \(error.userInfo)")
}
答案 2 :(得分:0)
我需要进一步研究这个问题,因为我仍然对核心数据感兴趣,但在我能找到时间之前,我认为可能对你有用的是:
问题1:也进入销售实体的销售。我不相信这会为你做。关系真正变得重要的是删除。您可以指定要删除规则的内容,无论是nullify,deny,cascade还是no action。 Raywenderlich.com有一个关于核心数据的优秀教程系列,可以帮助你。问题2:我认为它取决于哪个表(尽管在CoreData中,术语是ManagedObject)存储了您要查找的数据。查询销售实体对我来说最有意义。如果您不想,您不必查询整个销售实体。您可以指定搜索参数。
答案 3 :(得分:0)
从swift 3开始,您不必创建在Core Data中创建的实体类的属性,因为Core Data会为您执行此操作。您必须初始化这些属性。关系也是如此。例如,在产品类(父级)的情况下,销售人员(子级)的关系已经为您实例化。因此,您可以通过获取产品类中的关系实例来访问和设置实体销售。可能有其他方法可以做到这一点,但我认为使用扩展非常酷。
扩展产品{
//你可以这样调用这个构造函数:只要你“导入CoreData”,就可以从程序的任何部分调用产品(销售) //如果它的1次销售然后是1-1,如果它超过1则是1-many 便利初始化?(销售或销售){
let MOC = (UIApplication.shared.delegate as! AppDelegate).managedObjectContext
self.init(context: MOC)
//case 1 when sale is 1-many
let sale = Sale(context: MOC)
//case 2 when sale is many-many(this can be an array of objects that you sent)
let sale1 = Sale(context: MOC)
let sale2 = Sale(context: MOC)
let sale3 = Sale(context: MOC)
//setting sale object
sale.property = ""
//现在是时候设置与刚刚设置的对象的关系
//case when is 1 - many
self.sale = sale
//case when is many - many
self.sale?.adding(sale1)
self.sale?.adding(sale2)
self.sale?.adding(sale3)
}
现在您的产品将与您的销售相关....