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

问题描述:

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

有人请给出一些关于如何将NSMutableArray中的实例保存到文件(也可能是如何加载它们的示例)的建议/示例。我找不到任何我搜索过的例子。我试过将数组转换为NSData,并使用NSKeyedArchiver没有成功。我也尝试转换为NSArray,但无法使其正常工作。

在自定义类中,我实现了encodeWithCodeinitWithCoder

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

我卡住了... :(

编辑:在Ageektrapped的要求,这里的代码片段:

我的书签类的实现内部:

- (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(当下面的代码被调用时,存在l东一个书签阵列中的一个条目)。

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"); 
} 
+0

,你能否告诉我们encodeWithCoder:和的initWithCoder:方法实现?并将该数组保存到文件的代码? – ageektrapped 2013-04-06 11:25:56

我终于弄清楚我的问题是什么。 由于我在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];