需要建议将两个plist合并到一个数组中

时间:2011-10-08 02:44:11

标签: iphone objective-c cocoa-touch nsarray plist

目前,我有一个tableView,它从以下名为exerciseArray的数组中加载:

if (exerciseArray == nil)
    {
        NSString *path = [[NSBundle mainBundle]pathForResource:@"data" ofType:@"plist"];
        NSMutableArray *rootLevel = [[NSMutableArray alloc]initWithContentsOfFile:path];
        self.exerciseArray = rootLevel;
        [rootLevel release];
    }

但是,我想要一个选项让用户添加自己的数据,这些数据需要在同一个表视图中显示。我可以将这些数据添加到原始plist中,但我认为最好创建一个单独的plist,让用户添加数据。

因此,在用户添加数据之后,我将需要下次合并2个plist数据。知道如何实现这个吗?用户添加的数据需要与原始的plist结构匹配,如下所示:

enter image description here

新的plist应该只有ExerciseNamemusclename,但我需要以某种方式将两者合并。

1 个答案:

答案 0 :(得分:1)

用户定义的属性列表应存储在 Documents 目录中的某个文件中。通常,对于这样的事情,我建议创建应用程序附带到 Documents 目录的默认Plist的副本,然后根据需要修改和加载此文件。将资源复制到文档目录可以按如下方式完成:

NSString * documentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString * docPlist = [documentsPath stringByAppendingPathComponent:@"data.plist"];
if (![[NSFileManager defaultManager] fileExistsAtPath:docPlist]) {
    NSString * resPlist = [[NSBundle mainBundle]pathForResource:@"data" ofType:@"plist"];
    [[NSFileManager] defaultManager] copyItemAtPath:resPlist
                                             toPath:docPlist
                                              error:nil];
}
NSMutableArray * root = [[NSMutableArray alloc] initWithContentsOfFile:docPlist];

上面的代码只是找到文档目录中plist的路径,并检查它是否存在。如果没有,则将 data.plist 资源复制到文档目录。完成此操作后,它会将根元素加载到可变数组中,然后您可以使用标准addObject:removeObject:方法进行修改。

最后,保存任何已修改的数据,只需将root数组写回plist文件,如下所示:

[root writeToFile:docPlist atomically:YES];

唯一的解决方案是,在开发应用程序的过程中,您可能希望更改或修改 data.plist 资源中的某些数据。为了让应用程序将这个新修改的属性列表复制到文档目录,您需要从iOS模拟器中完全卸载它,然后重新编译并运行。

编辑:为了为现有肌肉添加练习,只需执行以下操作:

// find the exercise dictionary
int muscleIndex = 0;
NSMutableDictionary * muscleDict = nil;
NSString * muscleName = @"Neck";
NSString * exerciseName = @"Nod your head a billion times";
// find the right muscle
for (int i = 0; i < [root count]; i++) {
    NSDictionary * muscle = [root objectAtIndex:i];
    if ([[muscle objectForKey:@"muscleName"] isEqualToString:muscleName]) {
        muscleIndex = i;
        muscleDict = [NSMutableDictionary dictionaryWithDictionary:muscle];
    }
}

NSMutableArray * exercises = [NSMutableArray arrayWithArray:[muscleDict objectForKey:@"exercises"]];
[exercises addObject:exerciseName];
[muscleDict setObject:exercises forKey:@"exercises"];
[root replaceObjectAtIndex:muscleIndex withObject:muscleDict];
...
// save root here