我有几个问题是基于在plist中读取和写入NSArray
。
我在“支持文件”中创建了一个plist文件。我希望用于在第一次加载时初始化应用程序数据的文件夹。
这是我的plist的样子:
然后我使用此代码尝试将plist加载到应用程序中:
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
filePath = [documentsDirectory stringByAppendingPathComponent:kDataFile];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:filePath])
{
NSString *bundle = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
[fileManager copyItemAtPath:bundle toPath:filePath error:&error];
}
然后我尝试从plist文件中加载数据,但似乎没有显示任何内容。
NSMutableDictionary *savedData = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
NSMutableArray *myNSArray = [[savedData objectForKey:@"KEY_Level_1"] mutableCopy];
savedData = nil;
很抱歉,如果这是一项简单的任务,但我一直在查看大量的教程,并试图找出如何做到这一点,没有运气。我现在变得非常沮丧 - 我原以为这应该是一件简单的事情。
注意:我的NSArray
将包含大量NSDictionaries。
答案 0 :(得分:0)
您需要检查copyItemAtPath:toPath:error:
的返回值,并至少在方法返回false时记录错误:
if (![fileManager copyItemAtPath:bundle toPath:filePath error:&error]) {
NSLog(@"error: copyItemAtPath:%@ toPath:%@ error:%@", bundle, filePath, error);
return;
}
-[NSDictionary initWithContentsOfFile:]
无法报告错误,因此如果失败,您就无法轻易找出原因。尝试将文件读入NSData
并使用-[NSPropertyListSerialization propertyListWithData:options:format:error:]
进行解析:
NSData *data = [NSData dataWithContentsOfFile:filePath options:0 error:&error];
if (!data) {
NSLog(@"error: could not read %@: %@", filePath, error);
return;
}
NSMutableDictionary *savedData = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainers format:NULL error:&error];
if (!savedData) {
NSLog(@"error: could not parse %@: %@", filePath, error);
return;
}
NSMutableArray *myNSArray = [savedData objectForKey:@"KEY_Level_1"];
savedData = nil;
if (!myNSArray) {
NSLog(@"error: %@: object for KEY_Level_1 missing", filePath);
return;
}
如果这样做,您将能够更轻松地了解数据未加载的原因。
<强>更新强>
在进一步检查时,看起来plist中的顶级字典包含键“Root”。 “Root”的值是包含键“KEY_Level_1”的字典。所以你需要这样做:
NSMutableArray *myNSArray = [[savedData objectForKey:@"Root"] objectForKey:@"KEY_Level_1"];