【问题标题】:Need advice for merging two plists into an array需要将两个 plist 合并到数组中的建议
【发布时间】:2011-10-08 02:44:11
【问题描述】:

目前,我有一个 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 结构相匹配,如下所示:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    [root writeToFile:docPlist atomically:YES];
    

    唯一的困境是,在开发应用程序的过程中,您可能希望更改或修改 data.plist 资源中的一些数据。为了让应用程序将这个新修改的属性列表复制到 documents 目录中,您需要从 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
    

    【讨论】:

    • 感谢 Alex 提供的非常详细的信息。我要这样做。一个问题。用户添加的数据将为exerciseName。我需要将它添加到正确位置的多个字典中。用户将从菜单中选择它属于哪个肌肉,我需要将它添加到字典中的该肌肉。例如,用户输入属于Neck肌肉下的Neck Pull Exercise,然后在上图中,我需要将其添加为item 3,并带有`exerciseName。我该如何指定?
    • 只需遍历根目录中的所有项目,并找到具有正确muscleName 的字典。然后,从该字典的exercises 创建一个NSMutableArray,并添加您的新练习。然后,用新的 NSMutableArray 替换 exercises 数组,并像往常一样写入根数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多