NSDictionary和核心数据

use*_*672 13 core-data nsdictionary iphonecoredatarecipes ios

请我尝试获取核心数据方面的一些知识.到目前为止,我已经掌握了创建实体以及添加,检索和删除此实体的值的问题.

我的问题如下.NSDictionary使用核心数据时,在实体中存储属性的可能方法是什么?

fun*_*rry 31

你应该使用"Transformable Attributes":

  1. 打开*.xcdatamodeld文件
  2. 选择实体
  3. 添加属性(将其命名为" info ")并将类型设置为" Transformable "
  4. 生成适当的NSManagedObject子类文件(File-> New-> File ... NSManagedObjectsubclass)
  5. 打开*.h文件并将属性" info "的类型从id更改为NSMutableDictionary*

其他一切都自动运作

有关详细信息,请参阅:https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html

  • 这里答案中提到的链接已经死了. (3认同)
  • 默认转换器将序列化为NSData。对于NSDictionary,这是一个二进制plist。 (2认同)

Mat*_*att 6

有几种方法可以解决这个问题:

一个.创建一个代表NSDictionary的实体,以便每个字典键由实体属性表示.

湾 如果您不喜欢创建单独实体的上述方法,则仍可以将NSDictionary存储到NSData类型的单个Core Data字段中,前提是您首先将NSDictionary序列化为NSData.

//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
Run Code Online (Sandbox Code Playgroud)

然后,当您从Core Data读取NSData时,您还需要将NSData转换回NSDictionary.

// 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
Run Code Online (Sandbox Code Playgroud)

C.最后,您可以使用持久性框架,例如Sensible TableView,其中自动获取,显示和保存所有数据结构.我自己省了很多代码.

  • 如果将属性定义为"可转换",则会自动进行归档/取消归档. (7认同)