2011-12-30 65 views
15

我有一個NSDictionary和一個CoreData數據庫。我想將NSDictionary插入到數據庫中。將NSDictionary插入到CoreData中

  1. 我該怎麼做(代碼片段如果可能的話)?

  2. 什麼是字典屬性的適當類型?

+0

要插入的字典作爲核心數據對象(所以做即從它創建一個NSManagedObject)還是你有一些核心數據實體,並希望字典作爲它的財產? – mrueg 2011-12-30 17:58:34

+0

是的,我想插入字典作爲核心數據對象 – OXXY 2011-12-30 18:59:02

回答

27

你需要將NSDictionary序列化爲NSData,CoreData可以容納NSData。
但是你將無法搜索(謂詞)你的NSDictionary的元素。

如果我們想一想,NSDictionary是一個數據集合。
數據庫中的表格是一種數據集合。
在CoreData中,您最接近的數據集合是NSManagedObject。

所以我的建議是製作一個NSManagedObject子類,它可以存放你的NSDictionary中的信息。 key將是屬性,值將是該屬性的value。你可以根據NSManagedObject子類的屬性進行搜索。

+0

VinceBurn首先我想謝謝你的答案,第二我想告訴你,我從你的NSDictionary解決方案逃脫,因爲我收到來自一個巨大的XML文件的數據,所以我想使用動態的方式填寫數據 – OXXY 2011-12-30 19:03:41

+1

@OXXY - 不客氣。我不確定我是否關注你,如果你的XML文件很大,你可以將它解析爲一個或兩個或三個不同的NSManagedObject子類。根據您的XML的內容,您可以修改您的操作。這樣你就可以查詢它。如果你不需要查詢它,你可以直接將該文件保存到磁盤,並將該URL存儲在覈心數據對象中,這幾乎與將其存儲爲NSData相同。如果一次只有其中一個不使用核心數據進行持久化。我不確定你的架構是什麼,所以我可能會脫節。 – 2011-12-30 19:46:34

+0

我已經提出了一個關於解析XML並將其存儲在數據庫中的問題也許它會幫助你跟着我http://stackoverflow.com/questions/8518884/import-xml-file-data-into-coredata – OXXY 2011-12-31 18:19:22

4

爲什麼不用你的NSDictionary創建一個包含所有數據的實體,然後通過它解析。

檢查this out for some CoreData code snippets.您可以簡單地創建幾個實體來存儲字典的信息。然後,您可以通過字典解析和保存適當的屬性:

NSManagedObject *photoObject = [NSEntityDescription insertNewObjectForEntityForName:@"Photo" 
                   inManagedObjectContext:context];  
[photoObject setPhotographer:[myDictionary objectForKey:@"photographer"]]; 
and so on... 

無論多麼複雜,你的XML數據結構,如果你可以設置一個不錯的實體結構,它是相當容易的,只需啞這一切在CoreData 。如果您花時間創建實體,而不是將整個字典傾倒在單個字段中,您還可以更容易地查詢查詢。

+0

親愛的Mattieu你的答案爲什麼是在這個問題上我 http://stackoverflow.com/questions/8518884/import-xml-file-data-into-coredata – OXXY 2012-01-02 11:06:02

5

設置你的實體描述,插入一個新的對象,然後使用:

[managedObject setValuesForKeysWithDictionary:dict]; 
+0

哇不知道有這樣的事情存在,謝謝! – dreampowder 2013-12-23 12:38:13

+1

請注意,這要求在使用此方法時實體描述沒有缺失部分 - 請參閱http://www.cimgf.com/2011/06/02/saving-json-to-core-data/ - 「在此方法中,字典中包含的關鍵字決定了被管理對象上使用了哪些關鍵字,但是如果字典中包含的關鍵字不是實體描述的一部分呢?那麼你的應用崩潰了,關於對象如何不是關鍵值編碼使用這種方法可以讓你的應用程序的穩定性受到你所使用的Web服務的支配。「 – 2014-06-10 20:20:42

8

我找到了另一種方式來添加字典轉爲Coredata通過創建數據類型爲「可轉換」的屬性。

例如,在您的項目&屬性中使用數據類型Transformable創建一個實體。 爲NSManagedObject生成子類。屬性將與數據類型「ID」一起提供,並更改爲NSDictionary。

下面是我做的(我的NSManagedObject子類的名字是「DictTest」)

-(void)InsertIntoDataBase 
{ 
    DictTest *entityDict=(DictTest*)[NSEntityDescription insertNewObjectForEntityForName:@"DictTest" inManagedObjectContext:self.managedObjectContext]; 
    NSMutableDictionary *mutDict=[NSMutableDictionary dictionary]; 
    [mutDict setValue:@"1" forKey:@"1"]; 
    [mutDict setValue:@"2" forKey:@"2"]; 
    [mutDict setValue:@"3" forKey:@"3"]; 
    [mutDict setValue:@"4" forKey:@"4"]; 
    [mutDict setValue:@"5" forKey:@"5"]; 
    [mutDict setValue:@"6" forKey:@"6"]; 
    [mutDict setValue:@"7" forKey:@"7"]; 
    [mutDict setValue:@"8" forKey:@"8"]; 
    [mutDict setValue:@"9" forKey:@"9"]; 
    [mutDict setValue:@"10" forKey:@"10"]; 
    [entityDict setInfoDict:mutDict]; 
    NSError *error; 
    if(![self.managedObjectContext save:&error]) 
    { 
     NSLog(@"error description is : %@",error.localizedDescription); 
    } 
    else{ 
     NSLog(@"Saved"); 

    } 
} 

用於提取記錄

-(void)FetchRecord 
{ 
    NSFetchRequest *request=[[NSFetchRequest alloc]init]; 
    NSEntityDescription *entity=[NSEntityDescription entityForName:@"DictTest" inManagedObjectContext:self.managedObjectContext]; 
    [request setEntity:entity]; 
    NSArray *fetchArray= [self.managedObjectContext executeFetchRequest:request error:nil]; 
    for (DictTest *obj in fetchArray) { 
     NSLog(@"Dict is : %@",obj.infoDict); 
    } 
}