将数组保存到文件目标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];