iOS plist中的新数组用新键覆盖旧数组用不同的键

Posted

技术标签:

【中文标题】iOS plist中的新数组用新键覆盖旧数组用不同的键【英文标题】:iOS New array in plist with new key overwrites old array with different key 【发布时间】:2013-02-13 15:03:34 【问题描述】:

我正在使用下面的代码将一个新数组添加到 plist 中,但是每次我在我的应用程序中添加一个带有文本字段的新数组时,它都会覆盖旧数组,即使它有一个全新的键..有什么想法吗?

- (IBAction)saveViewerItems

    // get paths from root direcory
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
    // get documents path
    NSString *documentsPath = [paths objectAtIndex:0];
    // get the path to our Data/plist file
    NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Data.plist"];

    // set the variables to the values in the text fields
    self.data = [[NSMutableArray alloc] initWithCapacity:20];


    // create dictionary with values in UITextFields
    NSDictionary *plistDict = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects: data, nil] forKeys:[NSArray arrayWithObjects: (@"%@", text), nil]];

    NSString *error = nil;
    // create NSData from dictionary
    NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

    // check is plistData exists
    if(plistData)
    
        // write plistData to our Data.plist file
        [plistData writeToFile:plistPath atomically:YES];
    

【问题讨论】:

这很可能完全是一个 n00b 问题(我对 ios 开发真的很陌生),但是为什么要将这些数据放在 plist 中而不是使用 Core Data 或 SQLite? 问题是每次你都没有在plist中添加数据。除此之外,您正在更新 plist。所以这会覆盖旧的数据 因为我也是新手,我真的不知道该怎么做-它必须保存的数据非常简单......使用sqlite或coredata更容易吗? 如何告诉它添加而不是重写? 你好@ChrisByatt,看看我的回答。其背后的逻辑是从 plist 获取所有对象,然后在该访问对象中获取新对象,然后将该对象写入 plist 【参考方案1】:

为了获取文件中已有的字典,使用:

NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:(NSString *)filePath];

要在该字典中写入另一个数组(使用不同的键),请使用:

[dictionary setObject:(id)myArray forKey:(NSString *)myKey];

为了写回文件,使用:

[dictionary writeToFile:(NSString *)filePath atomically:YES];

不需要使用NSData 类。欲了解更多信息,请查看Apple NSDictionary Class

【讨论】:

什么意思,能解释一下吗? 我修好了。因为我的代码每次都会创建一个 plist,删除它并将其更改为您的意味着如果没有 plist,则没有任何内容可以添加数据。我已经用这个修复了它:if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) //My original adding code else //your code【参考方案2】:

试试这个

    // get paths from root direcory
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
    // get documents path
    NSString *documentsPath = [paths objectAtIndex:0];
    // get the path to our Data/plist file
    NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Data.plist"];

    NSMutableDictionary *plist = [[NSDictionary dictionaryWithContentsOfFile:plistPath] mutableCopy];

    // set the variables to the values in the text fields
    self.data = [[NSMutableArray alloc] initWithCapacity:20];

   [plist setObject:[NSArray arrayWithObjects: data, nil] forKey:forKeys:[NSArray arrayWithObjects: (@"%@", text)];
   [plist writeToFile:path atomically:YES];
   [plist release];

【讨论】:

首先获取 plist 中的所有元素,然后在该 plist 对象中添加新对象,然后写入 感谢您的帮助。仅供参考release 不再适用于 iOS,因为自动引用计数不允许这样做。 没问题没必要在这里使用release!!

以上是关于iOS plist中的新数组用新键覆盖旧数组用不同的键的主要内容,如果未能解决你的问题,请参考以下文章

将带有值的新键添加到嵌套对象数组中

将来自不同视图控制器的字符串保存到 plist 而不覆盖旧的

用触动怎么读取plist的数组?

在两个字典数组中查找重复键以使用新数组字典更新旧数组字典

我需要一个脚本来用所有文件中的新库替换旧库[重复]

iOS 从 UITableView 滑动以删除 plist 中的数组