2012-03-15 30 views
0

我想在覈心數據中存儲NoteObjects。通常,NoteObject具有NSString *mainTextNSMutableArray *arrayOfTagsNSStrings的數組)。我想現在使用核心數據,但數組對於核心數據來說是一個棘手的問題。通常,NoteObject陣列中不會有超過50個標籤。那麼我應該如何建模?我有兩個選擇:如何建模我的核心數據實體?

  1. 使用transformable屬性來存儲陣列
  2. 使用一個一對多的關係,這是我讀過的是更多的「合法」的方式來做到這一點。

哪一個我應該使用,爲什麼?我將如何實現與我簡單結構的多對多關係?我似乎無法圍繞這個概念包裹我的手指。

+0

你確定CoreData是正確的方法 - 如果你的數據足夠小,你看看NSCoding嗎?如果你有一個大的數據集,然後按照@Eugene的答案:) – deanWombourne 2012-03-15 18:47:46

回答

4

使用多對多關係。因爲在獲取請求期間它更好,更輕鬆。請參閱下面的截圖。注意右側的關係管理器,將NoteObject中的「To-Many關係」設置爲標記。忽略播放器實體。

哦,要注意「刪除規則」。您可能希望刪除與給定NoteObject關聯的所有標籤。所以在這種情況下將它設置爲Cascade。

NoteObject實體enter image description here

標籤實體enter image description here

- 編輯:

要添加您需要首先獲取你的NoteObject多個標籤 - 我認爲會有某種形式的ID參數,你將用於區分NoteObjects。 CoreData將自動生成標籤的添加/刪除方法。你需要使用類似的代碼下面的一個:

- (void)addTags:(NSArray *)tags toNoteObjectWithID:(NSString *)noteID { 
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"NoteObject"]; 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"noteID == %@", noteID]; 
    [fetchRequest setPredicate:pred]; 
    NoteObject *noteObject = [[[self managedObjectContext] executeFetchRequest:fetchRequest error:nil] lastObject]; 

    for (NSString *tag in tags) { 
    Tag *t = [NSEntityDescription insertNewObjectForEntityForName:@"Tag" 
              inManagedObjectContext:[self managedObjectContext]]; 
    t.body = tag; 
    t.noteObject = noteObject; 
    [noteObject addTagsObject:t]; 
    } 
    [self saveContext]; 
} 
+0

那麼現在我怎麼會添加多個標籤到一個筆記對象? – Snowman 2012-03-15 18:58:00

+0

@mohabitar修改了答案 – Eugene 2012-03-15 19:06:32

+0

太棒了,謝謝。另外,我是否必須爲標記實體生成類文件? – Snowman 2012-03-15 19:14:29

1

你可以使用一個變形的財產,但你需要編寫的變壓器。

如果使用的是一對多的關係,你必須創造一個變量的附加實體,這大概只有一個屬性 - 字符串值,和一個關係。外推一點,我猜想你有一組有限的值標籤可以採取,你可能有一天想要所有具有標籤X的筆記 - 那麼你將能夠獲取包含X的字符串值的實體,然後使用即獲取關係中有X的對象的NSArray(無論你稱它爲什麼)。

1

陣列中的核心數據是唯一棘手的,因爲他們沒有之前的iOS 5的支持,所以你必須包括一些屬性(如創建日期),通過它們可以進行排序。如果您不介意需要iOS 5,則可以使用ordered relationships。結果在NSOrderedSet中返回,這非常類似於(也可以轉換爲)數組。或者,只需重新考慮問題 - 便籤或用戶的筆記上的標籤順序是否重要?如果您只是按字母順序顯示標籤,會不會好?如果是這樣,甚至更好 - 只要使用普通的舊(無序)對多關係即可。