我有一个对象字典; 它们都是应该可序列化的POCO对象.我应该用什么技术将它们写入磁盘.我正在寻找最简单的选项来编写一些列表来保存状态.
我想我有3个选择.
plist文件.然而,这似乎仅限于存储预定义的对象(字符串,数字等)而不是对象(如具有名称和年龄的人).
CoreData.(3.0中的新功能)这样可以正常工作; 但是我的数据模型需要改变以使其工作.这将是一个巨大的返工,我不确定是否值得努力.
SQLLite.实现一个简单的SQL数据库来读取和读取.我已经对此进行了最少的研究,但我不想"重写"一些核心数据ORM函数.
stefanB.. 33
要序列化自定义对象,您只需要符合NSCoding
协议.如果你的对象扩展了NSObject,你需要做的就是(我相信)实现这些(例如person对象的例子):
// Encode an object for an archive - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:name forKey:@“Name”]; [coder encodeInteger:age forKey:@“Age”]; } // Decode an object from an archive - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; name = [[coder decodeObjectForKey:@“Name”] retain]; age = [coder decodeIntegerForKey:@“Age”]; }
NSArray
并且NSDictionary
已经实现了序列化的方法.它们将序列化它们拥有的所有对象(如果对象实现了NSCoder接口 - 如果它们扩展了NSObject,它们会这样做).NSObject中的encodeWithCoder
和initWithCoder
所以,除非你实现你的类没有自己的代码做默认情况下没有被序列化.
如果你有NSArray或NSDictionary对象,你可以使用以下方法同步它们:
// Writing - (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag; - (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag; // Reading - (id)initWithContentsOfFile:(NSString *)aPath; - (id)initWithContentsOfURL:(NSURL *)aURL;
Marc W.. 14
您可以像在Mac OS X上一样执行此操作:您的POCO必须符合NSCoding
协议.请参阅此处以获取概念参考,此处为NSCoding参考.
如果数据并不那么疯狂,并且您的对象之间没有可笑的复杂关系,那么将所有内容写成plist可能是您的最佳选择; 它的执行速度非常快,并且在代码中实现起来非常简单.就像你说的,CoreData可能需要做很多额外的工作来调整你的代码,sqlite真的只适用于存储完美存储在关系数据库中的数据.请记住,与使用二进制plist相比,sqlite也更慢并且使用更多资源.
要序列化自定义对象,您只需要符合NSCoding
协议.如果你的对象扩展了NSObject,你需要做的就是(我相信)实现这些(例如person对象的例子):
// Encode an object for an archive - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:name forKey:@“Name”]; [coder encodeInteger:age forKey:@“Age”]; } // Decode an object from an archive - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; name = [[coder decodeObjectForKey:@“Name”] retain]; age = [coder decodeIntegerForKey:@“Age”]; }
NSArray
并且NSDictionary
已经实现了序列化的方法.它们将序列化它们拥有的所有对象(如果对象实现了NSCoder接口 - 如果它们扩展了NSObject,它们会这样做).NSObject中的encodeWithCoder
和initWithCoder
所以,除非你实现你的类没有自己的代码做默认情况下没有被序列化.
如果你有NSArray或NSDictionary对象,你可以使用以下方法同步它们:
// Writing - (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag; - (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag; // Reading - (id)initWithContentsOfFile:(NSString *)aPath; - (id)initWithContentsOfURL:(NSURL *)aURL;
您可以像在Mac OS X上一样执行此操作:您的POCO必须符合NSCoding
协议.请参阅此处以获取概念参考,此处为NSCoding参考.
如果数据并不那么疯狂,并且您的对象之间没有可笑的复杂关系,那么将所有内容写成plist可能是您的最佳选择; 它的执行速度非常快,并且在代码中实现起来非常简单.就像你说的,CoreData可能需要做很多额外的工作来调整你的代码,sqlite真的只适用于存储完美存储在关系数据库中的数据.请记住,与使用二进制plist相比,sqlite也更慢并且使用更多资源.