簡體   English   中英

存儲陣列屬性中的核心數據或使用文件或關系實體

[英]core data in storage array attribute or work with files or relationship entities

我正在嘗試使用核心數據工作很長時間。
我讀了很多關於這個的教程,我問了很多問題。

最后,我開始研究核心數據
通過本指南: www.appcoda.com/introduction-to-core-data/

而現在我被卡住了!
我想創建一種屬性,數組。
並告訴我這是一個關於屬性存儲數組的好方法。
這些與關系有關。

但這里的問題。
如果查看指南,它不會創建文件(類)實體
和所有其他指南。 是的,創建文件,所以他們沒有幫助我,因為我沒有我的實體文件。

有沒有辦法創建一種行為類似於一個屬性的關系,而不必創建文件創建實體?
因為我的項目已經很大了。

人們不建議使用數組作為CoreData實體的屬性的原因是:必須將數組轉換為原始數據以將其存儲到persistentStore,然后在從存儲中讀取對象時必須將其轉換回來。 這有可能變慢,原始數據可能變得“大”。 重要的是,由於屬性存儲為原始數據,因此無法使用取決於數組屬性內容的謂詞來獲取存儲對象的子集。 因此,例如,您不能(輕松)獲取“只有數組只有1個成員的對象”。

所以,人們建議使用關系。 我強烈建議您創建子類; 如果你這樣做,它將使你的生活變得如此簡單。 但是可以在沒有子類化的情況下使用關系。 假設您有一個Person實體(帶有namedateOfBirth屬性)和一個Course實體(只有一個name屬性)。

假設每個Person只能參加一門Course ,但每門Course可以由幾個人參加。 您可以創建從一對多的關系CoursePerson ,並將其命名為類似attendees 反向關系將是to-one名為類似course東西。 因此模型看起來像這樣:

在此輸入圖像描述

您熟悉使用valueForKeysetValue:forKey:來訪問屬性值,例如。 對於字符串屬性:

// Get...
NSString *myPersonName = [myPerson valueForKey:@"name"];
// Set...
[myPerson setValue:@"John Doe" forKey:@"name"];

使用相同的方法來獲取/設置關系。 對於to-one關系,您獲取/設置的值將是NSManagedObject

// Get...
NSManagedObject *personCourse = [myPerson valueForKey:@"course"];
// Set...
[myPerson setValue:myCourse forKey:@"course"];

對於to-many關系,事情變得稍微復雜一些。 由於Course可以有很多attendees ,因此您獲得/設置的值是NSSet

// Get...
NSSet *myCourseAttendees = [myCourse valueForKey:@"attendees"];
for (NSManagedObject *person in myCourseAttendees) {
    NSLog(@"Attendee's name is %@", [person valueForKey:@"name"];
}
// Set...
NSSet *newAttendees = [NSSet setWithObjects:newPerson1, newPerson2, nil];
[myCourse setValue:newAttendees forKey:@"attendees"];

這一切都很好,但有時您只想添加/刪除一位與會者:

NSMutableSet *attendees = [myCourse mutableSetValueForKey:@"attendees"];
[attendees removeObject:myPerson];
[attendees addObject:myNewPerson];

因此,管理to-one關系遠比to-many更容易。 這是個好消息:如果你的關系有反轉,每當你修改它時,CoreData會自動為你更新反向關系。 因此,如果你與to-one反對有to-many關系,那么就使用to-one 換句話說,它更容易使用:

[myPerson setValue:newCourse forKey:@"course"];

比:

NSMutableSet *attendees = [newCourse mutableSetValueForKey:@"attendees"];
[attendees addObject:myPerson];

兩者都達到了同樣的目的。

現在,正如其他人在其他地方指出的那樣,你實際上可能希望一個Person能夠參加許多不同的Courses 在這種情況下,關系及其反轉將是多to-many ,並且您使用可變集合方法被困住。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM