将数组保存到文件目标C.

时间:2012-06-22 15:21:23

标签: iphone objective-c ios ios5 nsarray

我一直坚持这一点,我终于明白了,现在只是突然之间,它又停止了工作......

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/scoreCards.dgs",documentsDirectory];

NSMutableArray *savedArrayOfScorecards = [[NSMutableArray alloc]init];
savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];
[savedArrayOfScorecards addObject:currentScoreCard];

[savedArrayOfScorecards writeToFile:filePath atomically:YES];

文件scoreCards.dgs甚至没有被创建......

我做错了什么?

5 个答案:

答案 0 :(得分:2)

这里可能会出现一些问题。

1)您存储在阵列中的数据类型可能无法对文件进行编码或归档。您包含的代码段并未提供有关您尝试保存哪种数据的良好提示。如果您的数组中有自定义对象(即非NSString,NSNumber,NSDate等),那么肯定是问题。 There are plenty of questions here on StackOverflow可能会帮助您解决此问题。

2)你的阵列的文件路径可能是假的。例如,您没有检查“documentsDirectory”是否为零或有效或可写。

3)也可能,但不太可能,“savedArrayOfScorecards”可能是一个零数组。您应该进行错误检查以确保实例化“savedArrayOfScorecards”并且数组中有多个对象。

答案 1 :(得分:1)

您的问题是,虽然您创建了一个数组,但在阅读该文件之前,您的电话会被忽略:

savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];

所以,因为这个savedArrayOfScorecards现在为零,所以你把它写入文件的调用没有做任何事情。 您应该将数组加载到另一个变量,并检查它是否为nil,并且仅当从文件读取的数组为nil时才创建新数组。像这样:

NSMutableArray *savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];
if (!savedArrayOfScorecards) {
    savedArrayOfScorecards = [[NSMutableArray alloc]init];
}

答案 2 :(得分:0)

加载时文件是否存在?

savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];

此行从文件中创建一个新的NSMutableArray。如果该文件不存在,则返回nil。 writeToFile然后被发送到零,没有任何事情发生。

添加一项检查以确定它是否为零,如果是,则创建一个新数组:

NSMutableArray *savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];
if(savedArrayOfScorecards == nil) savedArrayOfScorecards = [NSMutableArray array];
[savedArrayOfScorecards addObject:currentScoreCard];

[savedArrayOfScorecards writeToFile:filePath atomically:YES];

答案 3 :(得分:0)

NSMutableArray不是符合属性列表的格式。您必须使用NSArchiver才能使其符合要求。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/scoreCards.dgs",documentsDirectory];

NSMutableArray *savedArrayOfScorecards = [[NSMutableArray alloc]init];
savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];
[savedArrayOfScorecards addObject:@"ALLLAALLAAALLA"];

NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archive = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
[archive encodeObject:savedArrayOfScorecards forKey:@"Scorecards"];
[archive finishEncoding];

BOOL result = [data writeToFile:filePath atomically:YES];

NSLog(result ? @"YES" : @"NO");

enter image description here

答案 4 :(得分:0)

正确的答案已经在这里,只需添加更好的解决方案:

NSFileManager* fileManager = [NSFileManager defaultManager];
NSMutableArray* array;

if ([fileManager fileExistsAtPath:filePath]) {
    array = [NSMutableArray arrayWithContentsOfFile:filePath];

    NSAssert(array != nil, @"Invalid data in file.");
}
else {
    array = [[NSMutableArray] alloc] init];
}

[array addObject:currentScoreCard];
[array writeToFile:filePath atomically:YES];