2012-10-06 46 views
3

我有一個非常簡單的應用程序,它有一個CoreData實體,並具有與自身的循環關係。我想在另一個應用程序中將這些數據用作plist。核心數據 - 將實體保存爲pList /字典

該關係在父方&'對許多'在兒童方'對'。

基本上在頂部一個項目,然後該對象的孩子,孩子的對象,等孩子......樹

我想創建從這個數據字典/ plist出現的結構實體包括關係。 (這是有道理的嗎?)

到目前爲止,在這裏的其他答案的幫助下,我可以得到所有對象的plist(但都在同一個「級別」)或最終父對象的plist但孩子們的關係是錯誤的)。

這是我在做什麼,試圖獲取數據,並將其保存到我的桌面:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:ENTITY_NAME]; 
    request.resultType = NSDictionaryResultType; 

    NSError *fetchError = nil; 
    NSArray *results = [self.databaseDocument.managedObjectContext executeFetchRequest:request error:&fetchError]; 

    NSLog(@"%@", results); 

    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; 
    NSString *path = [caches stringByAppendingPathComponent:@"/../../../../../../../../Desktop/my.plist"]; 
    [results writeToFile:path atomically:NO]; 

目前只有三個對象。主對象,該對象的子對象和該子對象的子對象。

這是給我一個plist,它是一個包含三個對象的數組。

如果我有一個謂語只得到沒有父這樣的對象:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:ENTITY_NAME]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"parent == nil"]; 
    request.predicate = predicate; 

    NSError *fetchError = nil; 
    NSArray *results = [self.databaseDocument.managedObjectContext executeFetchRequest:request error:&fetchError]; 

    NSLog(@"%@", results); 

    Item *mainItem = [results lastObject]; 

    NSArray *keys = [[[mainItem entity] attributesByName] allKeys]; 
    NSDictionary *dict = [mainItem dictionaryWithValuesForKeys:keys]; 

    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; 
    NSString *path = [caches stringByAppendingPathComponent:@"/../../../../../../../../Desktop/my.plist"]; 
    [dict writeToFile:path atomically:NO]; 

這給了我一個目錄,但不包括兒童。

任何人都可以向我解釋我如何能得到像我的實體結構的plist?換句話說,只有一個包含所有孩子的目錄,以及該孩子目錄中每個孩子的孩子,等等......?

+0

中處理它們父子關係中的遞歸是否具有任意深度? – FluffulousChimp

+0

@NSBum是的,它可以永遠持續下去。 – Bertie

+0

@NSBum但實際上只能達到6或7級 – Bertie

回答

3

在保留關係的層次結構的同時,可能會有更好的方式將Core Data實體導出到plist,我願意接受教育。我想辦法在這樣的遞歸方法處理它們(這是完全未經測試 - 意味着只用於說明目的 - 也是我不完全知道你想怎麼構造的plist中,等)

- (void)processEntity:(NSManagedObject *)object forMutableArray:(NSMutableArray *)mutableArray { 
    NSMutableDictionary *entityInfo = [NSMutableDictionary new]; 

    // populate entityInfo with your object's properties 
    // however you are doing that now... 


    // if this object has children - process them 
    NSMutableArray *childArray = [NSMutableArray new]; 
    for(id child in object.children) { 
     [self processEntity:child forMutableArray:childArray]; 
    } 

    [entityInfo setObject:childArray forKey:@"children"]; 
    [mutableArray addObject:entityInfo]; 
} 

所以,通過遍歷頂級對象(沒有父對象的那些對象)開始該過程,然後在processEntity:forMutableArray:

+0

我不得不出門,所以不能嘗試這個,但當我回到電腦時,我會回到你身邊。我認爲可能有辦法讓頂級對象沒有錯誤,並且這會自動填充我的plist。我對核心數據非常陌生。 – Bertie

+0

作品魅力!感謝您的幫助,並且快速。接下來我要開始這條路,但這確實有幫助。它可能花了我很長時間才能縮小到這個範圍。 – Bertie