[英]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
實體的關系的核心數據編輯器中,您可以執行以下操作:
您的銷售關系如下所示:
關系不過是兩個實體之間的依賴關系,因此,兩個實體之間始終存在逆關系 ,請確保將它們掛鈎,如上所示。
我為什么要告訴你呢? 還記得我提到過,這取決於您要查詢哪個實體? 這才是重要的。
例如,如果Sale
定Product
的Sale
,則可以查詢產品本身(通過查詢其與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.