Swift iOS:将数据插入CoreData中的相关实体

时间:2016-03-08 03:12:15

标签: ios swift core-data

我试图理解在CoreData中的一对多关系实体中保存和检索记录的概念。我有两个表产品(主)和销售(细节)因此(一对多)关系密钥是(销售)。

问题1:在向产品注册销售时。我创建Sales实体的实例,填充值,然后将其添加到product.sales(relationship)并尝试managedObjectContext保存。

第一个问题:我是否还必须将Sales实体的实例输入销售实体?或者由于存在关系而自动更新?

第二个问题:如果我想查询到目前为止发生的所有销售,我是否会查询销售实体?或者我是否在产品实体中查询关系?

感谢您的帮助!

tab images

4 个答案:

答案 0 :(得分:1)

  

第一个问题:我是否还必须将Sales实体的实例输入销售实体?或者由于存在关系而自动更新?

您可能没有意识到的是,您通过将对象添加到managedObjectContext来固有地保存对象。一旦你做了像

这样的事情
let sale = Sale(context: managedObjectContext)

接着是

managedObjectContext.save()

上下文向持久性存储(实际的SQL数据库)发出保存请求。

因此,您是否需要存储销售的问题得到了解答,它将始终在保存上下文时存储。

  

第二个问题:如果我想查询到目前为止发生的所有销售,我是否会查询销售实体?或者我是否在产品实体中查询关系?

这取决于......

首先让我给你一点提示/最佳实践:

始终确保设置反向关系

Product实体关系的核心数据编辑器中,您可以执行以下操作:

enter image description here

您的销售关系如下所示:

enter image description here

关系只不过是两个实体之间的依赖关系,因此两个实体之间总是存在反向关系,请确保如上所示将它们连接起来。

为什么我这样告诉你?记得我提到它取决于你查询的实体是什么?这是重要的。

例如,如果您希望给定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)

}

现在您的产品将与您的销售相关....

相关问题