我一直坚持这一点,我终于明白了,现在只是突然之间,它又停止了工作......
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甚至没有被创建......
我做错了什么?
答案 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");
答案 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];