保存包含自定义类对象的NSMutableArray的内容

时间:2013-04-06 11:02:12

标签: object nsmutablearray save

我有一个自定义类“书签”,其中包含NSString。我使用NSMutableArray来存储此类的实例,从而创建一个书签列表,我在UITableView中显示UITableViewCell原型。

有人请提供一些关于如何将NSMutableArray中的实例保存到文件中的建议/示例(可能还有一个如何加载它们的示例)。我找不到任何我搜索过的例子。我已尝试将数组转换为NSData并使用NSKeyedArchiver但未成功。我也试过转换为NSArray,但无法让它发挥作用。

在自定义课程中,我实施了encodeWithCodeinitWithCoder

我需要在应用关闭之前保存,并且我想在应用启动时加载列表。

我被卡住了...... :(

编辑:应Ageektrapped的请求,以下是代码片段:

在我的Bookmark类的实现中:

- (void) encodeWithCoder: (NSCoder *) encoder
{
  [encoder encodeObject:self.address forKey:@"Address"];
}

- (id) initWithCoder: (NSCoder *) decoder
{
  self = [super init];
  if (self != nil)
  {
    self.address = [decoder decodeObjectForKey: @"Address"];
  }
  return self;
}

在我的MasterViewController

self.bookmarks是包含书签对象的NSMutableArray。 (当调用下面的代码时,书签数组中至少有一个条目。)

NSString *docFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory,NSUserDomainMask,YES) lastObject];
NSString *filename = [docFolder stringByAppendingPathComponent:@"data.plist"];
NSLog(@"File : %@", filename);
NSLog(@"Bookmarks : %d", self.bookmarks.count);

NSData *data = [NSKeyedArchiver archivedDataWithRootObject: self.bookmarks ];
if ([data writeToFile: filename atomically: YES])
{
  NSLog(@"Successful write");
} else {
  NSLog(@"Failed write");
}

1 个答案:

答案 0 :(得分:1)

我终于弄清楚我的问题是什么。 因为我正在我的iPhone设备上调试,所以某些文件夹不可写。我正在使用的代码是在这样的区域(NSDocumentationDirectory)中询问位置:

最终找到=> How can I get a writable path on the iPhone?我理解我的问题,并让它发挥作用。

我需要做的是替换:

NSString *docFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory,NSUserDomainMask,YES) lastObject];
NSString *filename = [docFolder stringByAppendingPathComponent:@"data.plist"];

使用:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString *libFolder = [paths objectAtIndex: 0];
NSString *filename = [libFolder stringByAppendingPathComponent: @"data.archive"];

我还改编了这些行(与示例一致):

NSData *data = [NSKeyedArchiver archivedDataWithRootObject: self.bookmarks ];
if ([data writeToFile: filename atomically: YES])
{
  NSLog(@"Successful write");
} else {
  NSLog(@"Failed write");
}

为:

BOOL success = [NSKeyedArchiver archiveRootObject: self.bookmarks toFile: filename];
if (success)
{
  NSLog(@"Successful write");
} else {
  NSLog(@"Failed write");
}

在应用程序启动时将文件读入NSMutableArray的代码是:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString *libFolder = [paths objectAtIndex: 0];
NSString *filename = [libFolder stringByAppendingPathComponent: @"data.archive"];
self.bookmarks = [NSKeyedUnarchiver unarchiveObjectWithFile: filename];