簡體   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