2012-02-20 78 views
2

我已經使用核心數據創建了對象的數據庫。我希望我的應用具有支持多個用戶的功能。每個用戶應該能夠看到存儲在數據庫中的對象列表,然後可以在應用程序中的帳戶中選擇想要使用的對象。商店之間的核心數據共享對象

實現此目的的最佳方式是什麼?我想爲每個用戶創建一個單獨的持久性存儲。共享對象,就像用戶選擇的默認主對象列表一樣,應該是「通用」持久性存儲的一部分,每個用戶的持久性存儲中的對象都將指向這個對象,這樣我就不會創建一堆重複的對象。

最重要的是,主列表中的每個對象都有子對象管理對象。這些孩子可以由每個用戶修改,因此他們應該對每個用戶的持久性商店都是唯一的。

有關最佳實踐的任何建議?我對Core Data相當陌生。

注意:一次只能登錄1個用戶。

非常感謝!

+1

它是mac還是iOS?請給它加標籤。 – vikingosegundo 2012-02-20 21:14:29

回答

3

您可以將多個商店添加到同一個持久性商店協調員,並且它應該都可以正常工作。有些事情知道的包括:

  1. 如果你有一個以上的商店包含相同的實體(即對象的類型),你將不得不使用的NSManagedObjectContext的-assignObject:toPersistentStore:方法來判斷哪些存儲使用上下文您添加的每個新對象。

  2. 任何特定的對象只能存在於一個永久存儲中。例如,如果您有多個像Tom,Dick和Harriet這樣的Person對象,三者都可以存在於一個商店中,或者它們可以在多個商店中分割,但是像Tom這樣的給定對象只能存在於一個商店中。

  3. 核心數據不允許您在不同商店中的對象之間創建關係。如果湯姆和迪克是兄弟,並且你想在你的模型中記錄這種關係,他們應該被分配到同一商店。可以使用fetched屬性而不是關係,但這不像關係那麼簡單。

因此,如果您沿着獨立的商店路徑走,普通商店可能包含一組供用戶選擇的「原型」對象。當用戶選擇一個對象時,您需要將該對象複製到用戶自己的商店中,並從該點開始處理該新對象。這樣,您可以使用關係來跟蹤每個對象的孩子,並且對孩子的更改對每個用戶都是唯一的。另一種方法是將主要對象保留在公用存儲中,並使用獲取的關係將它們與用戶存儲中的子對象關聯起來,但這似乎更復雜。

+0

正如我瞭解你的答案,你告訴他,多個商店可以共享實體類,但多個商店不能共享這些實體類的*實例*,不能共享託管對象本身,這真的是他想要的。我想如果他爲每個用戶使用單獨的商店,他將被迫創建「一堆重複的對象」,以便爲每個用戶提供他們對「默認主對象列表」的選擇。他用Rog的用戶實體方案可能會更好。 – Wienke 2012-02-20 23:46:36

+0

@Wienke感謝您的評論 - 我錯過了想要分享個別對象的觀點。修改答案以更好地處理這個問題。該OP似乎意圖在多家商店,我可以看到一些好處。例如,如果個人用戶帳戶的數據按商店分隔,則可能更容易保持個人用戶帳戶與設備同步。另外,可能有很多用戶和要求任何用戶都應該能夠使用任何設備,並且將單獨的用戶數據分開似乎對此有幫助。但是你說得很好,我希望我已經解決了它們。乾杯。 – Caleb 2012-02-21 02:16:02

4

爲什麼你需要獨立的商店?我認爲如果沿着這條路走下去的話,你會發現事情會變得非常複雜,特別是如果你是Coredata的新手。

所以,除非你有一個真正的理由去有獨立的專賣店,這裏就是我想要做的:

  1. 創建UserObject實體及聯營 性能
  2. 創建多到多UserObject實體(和反向)
  3. 讓用戶創建自己的個人資料(即創建一個新的User實例)
  4. 關係
  5. 獲取所有可用的Object實例
  6. 一旦用戶選擇他們感興趣的實例,就通過關係將Object實例與User實例相關聯。或者,您可以創建該對象的一個​​新實例,該實例對於User是唯一的(這是我的首選,因爲您提到需要具有由用戶自定義的「子」對象)。
  7. 完成後,保存上下文
  8. 從此處開始,您將能夠通過訪問關係user.objects來獲取該特定用戶感興趣的所有對象。您還可以通過相反的關係object.users獲取與特定Object關聯的所有User實例。

因爲