2011-12-30 24 views
15

Tôi có NSDictionary và Cơ sở dữ liệu CoreData. Tôi muốn chèn NSDictionary vào cơ sở dữ liệu.chèn NSDictionary vào CoreData

  1. Làm cách nào tôi có thể làm điều này (đoạn mã nếu có thể)?

  2. Loại thích hợp cho thuộc tính của từ điển là gì?

+0

Vì vậy, làm bạn muốn chèn vào từ điển như một đối tượng Core Data (tức là tạo ra một NSManagedObject từ nó) hoặc bạn có một số thực thể trong dữ liệu cốt lõi và muốn từ điển như là một tài sản cho nó? – mrueg

+0

vâng tôi muốn chèn từ điển làm đối tượng dữ liệu lõi – OXXY

Trả lời

27

Bạn cần tuần tự hóa NSDictionary của mình thành NSData, CoreData có thể giữ NSData.
Nhưng bạn sẽ không thể tìm kiếm phần tử (vị ngữ) của NSDictionary của bạn.

Và nếu chúng ta nghĩ về điều này, NSDictionary là tập hợp dữ liệu.
Một bảng trong cơ sở dữ liệu là một loại tập hợp dữ liệu.
Trong CoreData, điều gần nhất bạn có đối với tập hợp dữ liệu là NSManagedObject.

Vì vậy, lời khuyên của tôi sẽ là tạo một lớp con NSManagedObject chứa thông tin bạn có trong NSDictionary của mình. key sẽ là thuộc tính và giá trị sẽ là value thuộc tính đó. Và bạn sẽ có thể tìm kiếm dựa trên thuộc tính của lớp con NSManagedObject đó.

+0

VinceBurn đầu tiên tôi muốn cảm ơn bạn vì câu trả lời và thứ hai tôi muốn nói với bạn rằng tôi thoát khỏi giải pháp của bạn sang NSDictionary vì tôi nhận được dữ liệu từ một tệp XML khổng lồ. sử dụng một cách năng động để điền dữ liệu – OXXY

+1

@OXXY - Bạn được chào đón. Tôi không chắc chắn tôi đang theo dõi bạn, nếu tập tin XML của bạn là rất lớn, bạn có thể phân tích nó thành một hoặc 2 hoặc 3 lớp con NSManagedObject khác nhau. Tùy thuộc vào nội dung của XML của bạn, bạn có thể sửa đổi hành động của mình. Và theo cách đó bạn sẽ có thể truy vấn nó. Nếu bạn không cần truy vấn nó, bạn có thể lưu tệp đó trực tiếp vào đĩa và lưu trữ URL trong đối tượng dữ liệu lõi, hầu như sẽ giống như lưu trữ nó dưới dạng NSData. Và nếu chỉ có một trong số đó tại một thời điểm không sử dụng dữ liệu cốt lõi cho sự kiên trì. Tôi không chắc kiến ​​trúc của bạn là gì vì vậy tôi có thể nằm ngoài hàng. –

+0

Tôi đã đặt một câu hỏi về phân tích cú pháp XML và lưu trữ nó trong cơ sở dữ liệu có thể nó sẽ giúp bạn theo tôi http://stackoverflow.com/questions/8518884/import-xml-file-data-into-coredata – OXXY

4

Tại sao bạn không chỉ tạo một thực thể với tất cả dữ liệu từ NSDictionary của bạn và sau đó chỉ phân tích cú pháp thông qua nó.

Kiểm tra this out for some CoreData code snippets. Bạn chỉ cần tạo một vài thực thể để lưu trữ thông tin từ điển của bạn. Sau đó bạn có thể phân tích cú pháp thông qua các từ điển của bạn và lưu các thuộc tính thích hợp:

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

Không có vấn đề như thế nào phức tạp bạn cấu trúc dữ liệu XML, nếu bạn có thể thiết lập một cơ cấu tổ chức tốt đẹp, nó là khá dễ dàng chỉ đơn giản là câm nó tất cả trong CoreData . Bạn cũng sẽ có thời gian dễ dàng hơn nhiều với các truy vấn nếu bạn dành thời gian để tạo các thực thể thay vì chỉ bán toàn bộ từ điển trong một trường duy nhất.

+0

thân yêu Mattieu câu trả lời cho lý do của bạn là về câu hỏi này của tôi http://stackoverflow.com/questions/8518884/import-xml-file-data-into-coredata – OXXY

5

Thiết lập mô tả thực thể của bạn, chèn một đối tượng mới, sau đó sử dụng:

[managedObject setValuesForKeysWithDictionary:dict]; 
+0

wow không biết có một cái gì đó như thế tồn tại, cảm ơn ! – dreampowder

+1

Lưu ý rằng điều này đòi hỏi rằng mô tả thực thể không có phần còn thiếu khi sử dụng phương pháp này - xem http://www.cimgf.com/2011/06/02/saving-json-to-core-data/ - "Trong phương pháp này , các khóa có trong từ điển xác định khóa nào được sử dụng trên đối tượng được quản lý.Nhưng nếu từ điển chứa khóa không phải là một phần của mô tả thực thể thì ứng dụng của bạn sẽ gặp lỗi về cách đối tượng không phải là mã khóa-giá trị Sử dụng phương pháp này ở đây đặt sự ổn định của ứng dụng vào lòng thương xót của dịch vụ web bạn đang sử dụng. " –

8

tôi tìm thấy một cách khác để thêm từ điển vào CoreData bằng cách tạo ra một thuộc tính với kiểu dữ liệu 'năng biến'.

Ví dụ: tạo một thực thể trong dự án của bạn & thuộc tính với kiểu dữ liệu Biến đổi. Tạo phân lớp cho NSManagedObject. Thuộc tính sẽ có sẵn với kiểu dữ liệu 'id', thay đổi thành NSDictionary.

Dưới đây là những gì tôi đã (NSManagedObject tên tiểu lớp của tôi là '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"); 

    } 
} 

cho hồ sơ Tìm nạp các

-(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); 
    } 
}