将数组保存到文件目标C

我一直坚持这一点,我终于弄明白了,现在只是蓝色,它停止了工作…

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甚至没有得到创build…

我究竟做错了什么?

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

1)您在数组中存储的数据types可能不是可编码或可归档的文件。 你所包含的代码片段并没有提供你想要保存什么样的数据。 如果你的数组中有自定义对象(即不是NSString,NSNumber,NSDate等),那肯定是这个问题。 这里有很多 关于StackOverflow 的问题可以帮助你解决这个问题。

2)你的arrays的文件path可能是假的。 例如,您不检查“documentsDirectory”是否为零或有效或可写。

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

你的问题是,虽然你创build一个数组,但是在读取文件之前,你的调用将被忽略:

 savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath]; 

所以,因为这个保存的ArrayOfScorecards现在是零,所以你把它写到一个文件的调用没有做任何事情。 你应该加载数组到另一个variables,并检查它为零,并创build新的数组,只有从文件读取为零。 像这样的东西:

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

你确定文件加载时是否存在?

 savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath]; 

这一行从文件中创build一个新的NSMutableArray。 如果该文件不存在,则返回nil。 writeToFile然后发送到零,什么都不会发生。

添加一个检查,看看它是否为零,如果是的话创build一​​个新的数组:

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

NSMutableArray不是一个属性列表兼容的格式。 您必须使用NSArchiver使其符合plist。

 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"); 

在这里输入图像说明

正确的答案已经在这里,只是添加一个更好的解决scheme:

 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];