将一组新数据写入Plist而不是覆盖它

时间:2012-01-11 09:20:17

标签: iphone ios nsmutablearray plist save

我正在尝试使用plist来存储多组数据,但每次保存时(使用ActionSheet中的按钮),它都会覆盖前一组。我想添加多个“朋友”及其数据。我不太热衷于使用核心数据,所以我想知道如何使用Plist来做到这一点。

以下是保存按钮的代码:

        NSMutableDictionary *friend = [[NSMutableDictionary alloc] init];

        NSMutableDictionary *array = [[NSMutableDictionary alloc]init];
        [array setObject:friendName.text forKey:@"Name"];
        [array setObject:friendPhone.text forKey:@"Phone Number"];
        [array setObject:friendEmail.text forKey:@"Email Address"];
        [array setObject:friendChatSN.text forKey:@"Chat Screen Name"];

        [friend setValue:array forKey: @"Friend Data"];


        NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);

        NSString *documentsPath = [paths objectAtIndex:0];

        NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"FriendList.plist"];

        [friend writeToFile:plistPath atomically: TRUE];

除了覆盖它之外,我如何修改代码以在每次保存时添加一组新的朋友数据?

2 个答案:

答案 0 :(得分:10)

这里pList表现为一个对象。因此,无论何时尝试将某些内容写入plist,它都会被新数据替换。

看起来你想将多个朋友记录保存到plist文件中。您的问题的最佳解决方案是使用核心数据或sqlite。但是如果你想用plist实现它,那么首先从plist获取旧数据并将新数据(朋友)添加到旧数据然后保存到plist应该可以解决。

根据您的要求,您应该将NSArray多个NSDictionary(朋友记录)对象保存到pList。

这是修改后的代码

NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsPath = [paths objectAtIndex:0];

    NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"FriendList.plist"];

    NSMutableArray *friend = [NSMutableArray arrayWithContentsOfFile:plistPath];

    if (nil == friend) {
        friend = [[NSMutableArray alloc] initWithCapacity:0];
    }
    else {
        [friend retain];
    }


    NSMutableDictionary *array = [[NSMutableDictionary alloc]init];
    [array setObject:friendName.text forKey:@"Name"];
    [array setObject:friendPhone.text forKey:@"Phone Number"];
    [array setObject:friendEmail.text forKey:@"Email Address"];
    [array setObject:friendChatSN.text forKey:@"Chat Screen Name"];

    [friend addObject:array];
    [array release];



    [friend writeToFile:plistPath atomically: TRUE];
    [friend release];

答案 1 :(得分:0)

而不是[friend setValue:array forKey:@“Friend Data”];使用唯一的密钥代替@“朋友数据”,例如朋友姓名+姓氏(至少......),或者每次在字典中输入一个条目。