如何阅读&写一个NSArray来plist?

时间:2011-12-20 18:40:56

标签: iphone objective-c nsarray plist

我有几个问题是基于在plist中读取和写入NSArray

我在“支持文件”中创建了一个plist文件。我希望用于在第一次加载时初始化应用程序数据的文件夹。

这是我的plist的样子:

enter image description here

然后我使用此代码尝试将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。

1 个答案:

答案 0 :(得分:0)

  1. 您需要检查copyItemAtPath:toPath:error:的返回值,并至少在方法返回false时记录错误:

    if (![fileManager copyItemAtPath:bundle toPath:filePath error:&error]) {
        NSLog(@"error: copyItemAtPath:%@ toPath:%@ error:%@", bundle, filePath, error);
        return;
    }
    
  2. -[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;
    }
    
  3. 如果这样做,您将能够更轻松地了解数据未加载的原因。

    <强>更新

    在进一步检查时,看起来plist中的顶级字典包含键“Root”。 “Root”的值是包含键“KEY_Level_1”的字典。所以你需要这样做:

    NSMutableArray *myNSArray = [[savedData objectForKey:@"Root"] objectForKey:@"KEY_Level_1"];