我有简单地从NSObject的继承的自定义对象。它有3名成员 - 两个浮点数和NSDate

我的应用程序都将有与许多这些对象踢周围的阵列,并且我需要运行之间持续它。我怎样才能做到这一点?

我想过如何使用SQLite数据库,但我认为这是因为我曾经做的是select *唯一查询有点大材小用。

在一个理想的世界我想使用XML plist文件。我不知道如果我可以用我的自定义对象,虽然做到这一点。我知道有一组属性列表的对象,而NSArray来下如此,但writeToFile:atomically:只有属性列表对象的工作。

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

有帮助吗?

解决方案

NSCoding将不正是你想要的。我建议你在苹果文档阅读它,但我认为这是非常简单易用。类(和任何子类)将需要实现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,你需要修改的最后两个方法你的情况,但大多数样板代码是相同的。

其他提示

如果你打算要检索对象的子集,SQLite是目前最好的选择。

如果不是,它是的plist格式和NSCoding之间的选择。 plist中要求您能够将您的自定义对象转换成东西plist中友好然后转换的plist回你的对象,但NSCoding是有点难以绕到你的头,不能用手容易地编辑(或检查)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top