繁体   English   中英

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

[英]Swift iOS : Insert data into related entities in CoreData

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

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

第一个问题:我还必须将销售实体的实例输入到销售实体中吗? 还是因为存在关系会自动更新?

第二个问题:如果我要查询迄今为止发生的所有销售,是否要查询销售实体? 还是我在产品实体中查询关系?

谢谢你的帮助!

标签图像

第一个问题:我还必须将销售实体的实例输入到销售实体中吗? 还是因为存在关系会自动更新?

您在这里可能没有意识到的一点是,您本质上是通过将对象添加到managedObjectContext来保存对象。 一旦你做类似的事情

let sale = Sale(context: managedObjectContext)

其次是

managedObjectContext.save()

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

因此,将回答您是否还需要存储销售的问题,该问题将始终在保存上下文时存储。

第二个问题:如果我要查询迄今为止发生的所有销售,是否要查询销售实体? 还是我在产品实体中查询关系?

那要看...

首先,我给您一些小技巧/最佳实践:

始终确保建立逆向关系

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

在此处输入图片说明

您的销售关系如下所示:

在此处输入图片说明

关系不过是两个实体之间的依赖关系,因此,两个实体之间始终存在逆关系 ,请确保将它们挂钩,如上所示。

我为什么要告诉你呢? 还记得我提到过,这取决于您要查询哪个实体? 这才是重要的。

例如,如果SaleProductSale ,则可以查询产品本身(通过查询其与sale有关的关系):

let product = [A product instance from your Core Data store]
let sale = product.sale // returns the sale the product is associated to

如果要获取给定销售中的所有产品,则可以利用products关系来查询Sale实体:

let sale = [A sale from your Core Data store]
let products = sale.products // the products contained in the sale

您提到要在给定日期进行所有销售

查询Product实体毫无意义,因为每个产品仅与其所含的销售有关系。

因此,要回答您的问题,您应该查询Sale实体以检索给定日期的所有销售。

希望对您有所帮助,让我知道是否有不清楚的地方。

    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)")
        }

我还需要进一步研究这一点,因为我仍然会继续关注Core Data,但是在找到时间之前,我认为可能对您有用的是:

问题1:将销售也输入销售实体。 我不相信这会为您完成。 关系真正变得重要的地方是删除。 您可以指定要删除规则的内容,无论是取消,拒绝,级联还是不执行任何操作。 Raywenderlich.com有一个关于核心数据的优秀教程系列,可能对您有帮助。

问题2:我认为这取决于要查找的数据存储在哪个表中(尽管在CoreData中,该术语是ManagedObject)。 查询销售实体对我而言最有意义。 如果不想,您不必查询整个销售实体。 您可以指定搜索参数。

从swift 3开始,您不必创建在Core Data中创建的实体的类的属性,因为Core Data会为您执行此操作。 您确实必须初始化这些属性。 关系也是如此。 例如,对于产品类(父类),已经为您实例化了与销售(子类)的关系。 因此,您可以通过获取产品类中的关系实例来访问和设置实体销售。 可能还有其他方法可以做到,但是我认为使用扩展很酷。

扩展产品{

///您将这样调用此构造函数:只要您“导入CoreData”,就可以从程序的任何//部分调用Product(sale)//如果其1 Sale则为s 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)

}

现在,您的产品将与您的销售....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM