3

在我为学校项目创建的 iOS 应用程序中,我无法保存存储在 NSMutableArray 中的数据。该数组在应用程序委托文件中创建,然后在其他各种视图控制器文件中为其创建委托。存储在数组中的数据由由 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 个 NSString、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"];
}

但这似乎对我不起作用。任何帮助将不胜感激。我觉得这应该是一件相当容易的事情,但我似乎无法理解。

4

3 回答 3

1

Core Data 实际上实现起来非常简单和快速。几个月前,我发表了一篇关于快速设置的博客文章。只需制作实体来表示您创建的不同类或自己添加 @dynamic 属性。

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

于 2011-04-02T21:59:38.877 回答
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 方法。

于 2011-04-02T15:51:56.567 回答
0

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

至于存档后释放阵列,当用户离开应用程序(它将被暂停)并稍后返回(应用程序只是重新激活,而不是重新启动)时,这将失败。在这种情况下,您释放数组的事实将导致您的应用程序崩溃。

于 2011-04-02T19:52:29.207 回答