当前位置:  开发笔记 > 数据库 > 正文

持久自定义对象

如何解决《持久自定义对象》经验,为你挑选了1个好方法。

我有一个自定义对象,只是继承自NSObject.它有3个成员 - 两个花车和一个NSDate.

我的应用程序将有一个数组,其中包含许多这些对象,我需要在运行之间保持它.我怎么能做到这一点?

我曾经考虑过使用SQLite数据库,但我认为它有点过分,因为我做过的唯一查询就是select *.

在理想的世界中,我想使用xml plist文件.我不确定我是否可以使用自定义对象执行此操作.我知道有一组属性列表对象,并且NSArray属于这个对象,但writeToFile:atomically:仅适用于属性列表对象.

任何想法将不胜感激,谢谢!



1> Don McCaughe..:

NSCoding会做你想要的.我建议你在Apple文档中阅读它,但我认为它非常简单易用.您的类(以及任何子类)将需要实现NSCoding协议,您需要为对象添加-encodeWithCoder:-initWithCoder:方法.大多数常见框架类NSCoding已经实现.

您的类的代码将如下所示:

-(void) encodeWithCoder: (NSCoder*) coder {
  [coder encodeInteger: versionValue forKey: versionKey];
  [coder encodeObject: myStuff forKey: myStuffKey];
}

-(id) initWithCoder: (NSCoder*) coder {
  self = [super init];
  if ( ! self) return nil;
  myStuff = [[coder decodeObjectForKey: myStuffKey] retain];
  return self;
}

建议您在编码时添加版本号,以便在将来的版本中灵活地管理对归档格式的更改.

在我的课上,我添加了一个方便的方法来存档我的对象:

-(void) archiveToFile: (NSString*) path {
  NSMutableData *data = [[NSMutableData alloc] init];
  NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data];
  [archiver encodeObject: self forKey: myArchiveKey];
  [archiver finishEncoding];
  [archiver release];
  [data writeToFile: path atomically: YES];
  [data release];
}

和另一个解压缩或创建一个新对象:

+(MyArchive*) newFromFile: (NSString*) path
            orWithMyStuff: (MyStuff*) myStuff
{
  NSData *data = [[NSData alloc] initWithContentsOfFile: path];
  NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data];
  MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey];
  [unarchiver finishDecoding];

  if (myArchive) {
    [myArchive retain];
  } else {
    myArchive = [[MyArchive alloc] initWithStuff: myStuff;
  }
  [unarchiver release];
  [data release];
  return myArchive;
}

由于您的顶级对象是一个NSArray,您需要修改最后两种方法,但大多数样板代码都是相同的.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有