【问题标题】:Saving IOS data to plist将IOS数据保存到plist
【发布时间】:2013-12-15 23:09:06
【问题描述】:

我正在将这些数据写入 plist 文件,但每次我写入时,它都会替换之前的任何内容。即,当我重新加载页面时,它会覆盖我之前拥有的任何数据。我怎样才能使以前的数据保持不变,或者有人可以指出我做错了什么?

- (IBAction)buttonClickSave:(id)sender;
{
 pathList=[self getFilePath];

    if(![[NSFileManager defaultManager] fileExistsAtPath:pathList])
    {

        [[NSFileManager defaultManager] copyItemAtPath:[[NSBundle mainBundle] pathForResource:@"adresses" ofType:@"plist" ]toPath:pathList error:nil];
    }
    NSString *Name = @"Names";
    NSString *email = @"email";
    NSString *phone = @"phone";

    NSMutableArray *values = [[NSMutableArray alloc] initWithObjects:Name, email, phone, nil];
    NSMutableArray *keys = [[NSMutableArray alloc] initWithObjects:kTitleKey, kEmail, kPhone, nil];
    NSDictionary *dict = [[NSDictionary alloc] initWithObjects:values forKeys:keys];
    [self.arraysData addObject:dict];

    [self.arraysData writeToFile:pathList atomically:YES];
}

【问题讨论】:

  • 首先从 plist 中读取数据并在其上追加新数据,然后写入 plist。
  • Plist 不是保存或更新数据的正确方法。它用于静态数据。最好为此使用sqlite。否则,您将不得不每次都重新创建您的 plist。

标签: ios iphone nsdictionary plist


【解决方案1】:

您所要做的就是从 plist 中读取所有数据,然后附加您的数据并将这些数据写入 plist

读取所有数据

NSMutableArray *plistArray = [NSMutableArray arrayWithContentsOfFile:pathList];

附加数据

[plistArray addObject:YOURDATA];

然后像这样写你的数组

[dict writeToFile:plistpath atomically:YES];

【讨论】:

  • 最后一行的dict是什么
【解决方案2】:

要初始化数组,请使用现有文件作为其源。这将确保您添加的任何条目都不会覆盖而是更改现有数据。

因此,无论您在哪里初始化 arraysData,请使用以下代码:

arraysData = [NSMutableArray arrayWithContentsOfFile: [self getFilePath]]; 

【讨论】:

    【解决方案3】:

    在插入之前,您会在 plist 中获取所有数据值。在将数据与您的逻辑或示例进行比较后,一种用于插入数据而不会覆盖

     // get plist paths from root directory
    
        NSArray *plistPath = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
    
    // get documents path
    
    NSString *documentsPathPlist = [paths objectAtIndex:0];
    
    NSString *plistDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];    // get the path to our plist file
    NSLog(plistDirectory);
    
        NSString *plistPathRoot = [plistDirectory stringByAppendingPathComponent:@"Sample.plist"];
    
        //This copies objects of plist to array if there is one
        [array addObjectsFromArray:[NSArray arrayWithContentsOfFile:plistPathRoot]];
    
    //If plist has less than 10 items, insert the new data. Don't use lastInsertionIndex. Else, replace one of the items.
    if([array count] < 10)
    {
         [array addObject:[textName.text]];
    }
    else
    {
    //Update the lastInsertionIndex
    lastInsertionIndex++;
    lastInsertionIndex %= 10; //// array size = 10
    
    [array replaceObjectAtIndex:lastInsertionIndex withObject:[textName.text]];
    }
    
    [array writeToFile:plistPath atomically: TRUE];
    

    另一个:

    这个下面的链接也用示例项目详细解释了 Plist without Overwrite。

    how-to-stop-overwriting-data-ios

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 2012-01-22
      • 2011-11-13
      相关资源
      最近更新 更多