2013-05-16 41 views
11

Xin vui lòng tôi đang cố gắng để đạt được một số kiến ​​thức trong dữ liệu cốt lõi. Tôi cho đến nay đã nhận được hang của việc tạo ra các thực thể và thêm, lấy và xóa các giá trị từ thực thể này.Dữ liệu NSDictionary và Core

Câu hỏi của tôi là như sau. Những cách có thể lưu trữ các thuộc tính NSDictionary trong một thực thể khi sử dụng dữ liệu lõi là gì?

Trả lời

5

Có một số cách để tiếp cận điều này:

a. Tạo một thực thể đại diện cho NSDictionary, sao cho mỗi khóa từ điển được đại diện bởi một thuộc tính thực thể.

b. Nếu bạn không thích cách tiếp cận ở trên, nơi bạn tạo một thực thể riêng biệt, bạn vẫn có thể lưu NSDictionary vào một trường Dữ liệu cốt lõi của kiểu NSData, miễn là bạn tuần tự hóa NSDictionary thành NSData trước.

//NSDictionary to NSData 
NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:dictionary forKey:@"Some Key Value"]; 
[archiver finishEncoding]; 
// data is now ready to use 

Bạn cũng cần chuyển đổi NSData trở lại NSDictionary khi đọc từ Dữ liệu chính.

// NSData to NSDictionary 
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]]; 
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
NSDictionary *dictionary = [[unarchiver decodeObjectForKey:@"Some Key Value"] retain]; 
[unarchiver finishDecoding]; 
// dictionary is now ready to use 

c. Cuối cùng, bạn có thể sử dụng khung công tác kiên trì như Bảng nhìn nhạy cảm, nơi tất cả các cấu trúc dữ liệu của bạn được tự động tìm nạp, hiển thị và lưu. Tiết kiệm cho tôi rất nhiều mã.

+6

Các lưu trữ/hủy lưu trữ xảy ra tự động nếu bạn xác định các thuộc tính là "Biến đổi". –

+0

Cảm ơn các bạn, thực sự đánh giá cao câu trả lời. Một điều nữa, làm thế nào về nếu bạn đang tìm kiếm lưu trữ các loại tài sản NSDictionary trong một loại thuộc tính của chuỗi trong dữ liệu cốt lõi? – user1889672

+0

Tất cả điều này có thể được thực hiện tự động, thay vào đó hãy xem câu trả lời thuộc tính Biến thể. Đặt thuộc tính thành Biến đổi và bạn đã hoàn tất. – malhal

29

bạn nên sử dụng "Thuộc tính năng biến":

  1. mở *.xcdatamodeld tập tin
  2. chọn thực thể
  3. add thuộc tính (tên nó ví dụ như "thông tin ") và thiết lập kiểu như" năng biến "
  4. tạo thích hợp NSManagedObject tệp lớp con (Tệp-> Mới-> Tệp ... NSManagedObject phân lớp)
  5. mở *.h tập tin và thay đổi kiểu cho thuộc tính "thông tin" từ id để NSMutableDictionary *

mọi thứ khác hoạt động tự động

để biết thêm thông tin xem: https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html

+1

Biến áp mặc định nối tiếp với NSData. Và đối với NSDictionary đây là một plist nhị phân. – malhal

+1

Vì vậy, tôi cần phải thay đổi id thành NSDictionary trong ".h" mỗi lần tôi tái gen NSManagedObjects của tôi? Có vẻ như là một nỗi đau và chắc chắn một điều gì đó mà mọi người sẽ quên làm. – lostintranslation

+0

@lostintranslation, không, chỉ để thuận tiện. Nó sẽ hoạt động ngay cả khi bạn không thay đổi loại. – FreeNickname

2

Thay đổi loại thuộc tính là Transformable.

Nếu bạn đang sử dụng máy phát điện (bạn rất cần), loại mặc định được tạo cho biến đổi là id.

Để thiết bị tạo đồng phát sinh loại cụ thể NSDictionary, bạn có thể thêm khóa tùy chỉnh attributeValueClassName với giá trị NSDictionary cho thuộc tính. Tham khảo screenshot này.

1

Tôi có một công việc xung quanh giải pháp cho rằng chỉ cần lưu dictionaryObj.description trong String trong Core Data và trong khi lấy chuỗi từ điển mà bạn có thể chuyển đổi thành từ điển

-(NSMutableDictionary *)getMetaDataDictionary:(NSString *)string 
{ 
    NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding]; 
    NSPropertyListFormat format; 
    NSMutableDictionary * metaDataDictionary; 
    @try 
    { 
     NSError * error; 
     metaDataDictionary = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable 
                        format:&format 
                         error:&error]; 
     if(!metaDataDictionary) 
     { 
      NSLog(@"ERROR: COULD NOT PARSE META-DATA : %@", error.description); 
     } 
    } 
    @catch(NSException * exp) 
    { 
     NSLog(@"DICTIONARY :: %@", exp.description); 
    } 

    return metaDataDictionary; 
} 
Các vấn đề liên quan