15

请我试图获得一些核心数据的知识。到目前为止,我已经掌握了创建实体以及从该实体中添加、检索和删除值的窍门。

我的问题如下。NSDictionary使用核心数据时,在实体中存储属性的可能方式有哪些?

4

3 回答 3

33

您应该使用“可转换属性”:

  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

于 2013-06-22T21:50:07.283 回答
6

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

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

湾。如果您不喜欢上述创建单独实体的方法,您仍然可以将 NSDictionary 存储到 NSData 类型的单个核心数据字段中,前提是您首先将 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

当您从 Core Data 读取它时,您还需要将 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

C。最后,您可以使用诸如 Sensible TableView 之类的持久性框架,您的所有数据结构都会在其中自动获取、显示和保存。我自己节省了大量代码。

于 2013-05-16T17:19:39.703 回答
4

将属性类型更改为Transformable

如果您正在使用 mogenerator(您应该),为可转换生成的默认类型是id.

要让 mogenerator 生成特定类型,您可以为属性添加一个带有值NSDictionary的自定义键。请参阅此屏幕截图attributeValueClassNameNSDictionary

于 2015-05-04T07:55:26.853 回答