如何在iOS中保存一个充满自定义类的数组?

时间:2011-04-02 15:38:40

标签: iphone objective-c nsarray saving-data

在我为学校项目创建的iOS应用程序中,我无法保存存储在NSMutableArray中的数据。该数组在app委托文件中创建,然后在各种其他视图控制器文件中创建它的委托。存储在数组中的数据由NSStrings和NSNumbers组成的自定义类组成。

我已经在这个网站上阅读并关注了大约一个星期的例子,但我不能为我的生活弄清楚。我也研究了核心数据,但是如果没有完全重新开始我就无法弄清楚如何实现它,不幸的是我很久没有了。

我尝试过的事情:

以WillTerminate方法存档。 (activityArray是我的数组)

- (void)applicationWillTerminate:(UIApplication *)application {
NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString* arrayFile = [documentsPath stringByAppendingPathComponent:@"arrayFile"];
[NSKeyedArchiver archiveRootObject:activityArray toFile:arrayFile];
[activityArray release];

然后在AppDelegate文件的didFinishLaunchingWithOptions方法中取消归档

    NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *arrayFile = [documentsPath stringByAppendingPathComponent:@"arrayFile"];
if ([fileManager fileExistsAtPath:arrayFile]) {
    NSLog(@"yes");
    activityArray = [NSMutableArray arrayWithContentsOfFile:arrayFile];
} else {
    activityArray = [[NSMutableArray alloc] init];
}

根据其他问题的建议,我在自定义类中执行了以下操作(此类有2个NSStrings,activityName和activityDescription)。

- initWithCoder:(NSCoder *)aCoder {
self = [super init];
activityName = [[aCoder decodeObjectForKey:@"activityName"] retain];
activityDescription = [[aCoder decodeObjectForKey:@"activityDescription"] retain];
return self;
 }

-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:activityName forKey:@"activityName"];
[aCoder encodeObject:activityDescription forKey:@"activityDescription"];
}

但这似乎都不适合我。感谢任何帮助。我觉得这应该是一件相当容易的事,但我似乎无法得到它。

3 个答案:

答案 0 :(得分:1)

核心数据实际上非常简单且快速实施。几个月前我快速设置了blog post。只需使实体代表您创建的不同类,或者自己添加@dynamic属性。

请记住,Core Data的行为与Array相同,因为只能存储对象。因此,您需要将NSNumber用于int \ floats等。

答案 1 :(得分:0)

您可以使用NSUserDefaults保存阵列,如下所示:

NSData *theData =  [NSKeyedArchiver archivedDataWithRootObject:activityArray];
[[NSUserDefaults standardUserDefaults] setObject:theData forKey:@"myArray"];

然后您可以按如下方式检索保存对象:

NSData *theData = [[NSUserDefaults standardUserDefaults] dataForKey:@"myArray"];
NSArray *activityArray = (NSArray *)[NSKeyedUnarchiver unarchiveObjectWithData:theData];

然而,为了实现这一点,您必须为您提到的任何自定义对象实现initWithCoder和encodeWithCoder方法。

答案 2 :(得分:0)

您是否真的检查过您的归档代码是否已执行?在启用了多任务的iOS 4下,几乎从不调用applicationWillTerminate:。您应该考虑将代码放在applicationDidEnterBackground:中。

至于在归档后释放数组,当用户离开应用程序时它会失败(它将被暂停)然后又回来(应用程序刚刚重新启动,而不是重新启动)。在这种情况下,您释放数组的事实将导致您的应用程序崩溃。