2016-12-19 61 views
0

即時新增CoreData因此我正在尋求一些幫助。我有兩個名爲List(name:String)和Items(名稱:String,quantity:Int)的實體。它們具有一對多關係,即List可以有多個Items。它們背後的邏輯是用戶可以用他的偏好名稱創建一個新的ListName並向它添加項目。將數據添加到CoreData中

enter image description here

我現在有兩個表視圖控制器,一個項目添加到項目實體,另一個顯示所有列表實體以及其中該名單包含任何項目。

我已經編寫了將項目保存到項目數組中的代碼,但是我的問題是如何編寫代碼來實現關係,這樣我就可以將[Items]保存在他們的尊重列表中,所以當我加載在我的tableView中,我可以查看它們的總數量。

例如列表(名稱:測試)將有一個項目(名稱:sometext,數量:1),等等。

+0

你有沒有爲此生成類? – PiyushRathi

+0

是的,我有,我創建了coredata實體並生成它們 – pavlos

+0

很酷,你知道coreData中的基本操作:1)創建實體。 2)保存 – PiyushRathi

回答

1

有幾個,我相信你應該解決的問題,之前我們實際上談解決你的問題。

錯誤1:命名約定

關係船舶核心數據應該以這樣的方式,當它們被放置在他們加入兩個實體的名稱之間的命名,他們提出了一個意思完整的句子。它使得開發人員(將來要維護的人)的生活變得簡單。

因此,不應將list和listitems之間的關係命名爲listName,這沒什麼意義,您應該考慮將其重命名爲「Contains」。

List - > Contains - > ListItems。說得通 ???

enter image description here

錯誤2:

創建關係,只有一個辦法,從列表中的項目,而不是建立從項目列表中的反比關係有時可能會導致將來不必要的代碼,

例如:假設您在特定列表中顯示項目的細節,並且出於某種原因,您想知道它屬於哪個列表,如果您沒有反向關係,則必須查詢核心數據以查找哪個列表項屬於哪個列表項取它後來:)

而是創建一個反比關係會讓你立即訪問列表對象。

enter image description here

繼早期提到的約定,項目 - >屬於關聯 - >列表:)

建議:

細心觀察的關係包含是一對多,其中作爲屬於關聯是一個一。這意味着一個列表可以包含很多項目,但項目只能屬於一個表:)

修改它根據自己的需要:)

讓我們回答這個問題:)

let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     appDelegate.managedObjectContext.performAndWait { 
     let item1 = NSEntityDescription.insertNewObject(forEntityName: "Item", into: appDelegate.managedObjectContext) as! Item 
     item1.name = "abcd" 
     item1.quantity = 2 

     let item2 = NSEntityDescription.insertNewObject(forEntityName: "Item", into: appDelegate.managedObjectContext) as! Item 
     item2.name = "efgh" 
     item2.quantity = 5 

     let list = NSEntityDescription.insertNewObject(forEntityName: "List", into: appDelegate.managedObjectContext) as! List 
     list.name = "Test1" 
     list.contains = NSSet(array: [item1,item2]) 

     //as an alternative you can save the list to item as well :) 
     //both will have same effect 

     item1.belongsTo = list 
     item2.belongsTo = list 

     try! appDelegate.managedObjectContext.save() 
    } 

由於你可以在上面的代碼中看到,

我創建了item1和item2,因爲我沒有任何我創建的列表項以及列表。如果你已經有名單從核心數據獲取和使用它:)以上

list.contains = NSSet(array: [item1,item2]) 

聲明建立項目1,ITEM2和列表:)

注意之間的關係::含有一組,所以如果你簡單地將它設置爲新值,你將失去所有現有的關係,因此你應該追加新的項目到現有的list.contains設置:)

在我的情況清單是新鮮的,因此簡單地將其設置爲新值:)

item1.belongsTo = list 
item2.belongsTo = list 

其中在如上語句做相同的工作,在這裏你不必擔心更新名單的包括財產,它會自動爲您的核心數據:)

更新,希望它能幫助:)

+0

工作就像一個魅力謝謝!如何獲取列表以及它的項目?我猜測它會調用與通常的fetchRequest不同的方法? – pavlos

+0

你可以使用NSFetchedResultsController。網上有很多教程,不能寫在這裏,因爲我最終會寫一個博客然後!!!你總是可以通過list.contains獲取列表對象中的項目,並且你可以使用NSFetchedResultsController獲取所有列表並實現它的委託:)像使用tableView的魅力一樣工作:)嘗試閱讀教程:)請考慮接受答案: ) –

+0

上面的評論並不意味着你不能使用NSFetchRequest,NSFetchRequest以array的形式返回數據並在內存中保存一個大數組效率非常低,因爲NSFetchedResultsContrller的工作原理是PageFault :) –