Создание нового словаря при сохранении данных в plist - PullRequest
0 голосов
/ 20 июля 2011

Итак, я сохраняю 3 строки NSStrings из 3 UITextFields в список свойств. Это работает нормально, но каждый раз, когда я сохраняю что-то новое, приложение перезаписывает данные, которые были сохранены ранее. Таким образом, в основном используется только 1 словарь, но я хочу, чтобы приложение создавало новый словарь каждый раз, когда я сохраняю что-то новое, чтобы никакие данные не удалялись. Я понятия не имею, как я могу это сделать, поэтому, пожалуйста, помогите мне! :)

Код:

NSMutableArray *array = [NSMutableArray arrayWithCapacity:3];
        NSArray *keys = [NSArray arrayWithObjects:@"1",@"2",@"3", nil]; 
        [array addObject:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSString stringWithFormat:@"%@",lab.text],[NSString stringWithFormat:@"%@",lab1.text],[NSString stringWithFormat:@"%@",lab2.text], nil] forKeys:keys]]; 
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
        [array writeToFile:path atomically:YES];

Ответы [ 3 ]

0 голосов
/ 20 июля 2011

Есть ли причина, по которой вы выделяете массив емкостью?Я бы просто использовал [[NSMutableArray alloc] init], а затем добавил ваши объекты.

Кроме того, у меня были проблемы с сохранением NSMutableDictionaries в NSUserDefaults, поэтому я просто сохранил словарь в файл с

[dict writeToFile:filePath atomically:NO];

и initWithContentsOfFile или initWithContentsOfURL в зависимости от того, хочу ли я загрузить локальный или интернет-файл.

Я должен добавить, что вы также можете написать toFile, initWithContentsOf * для NSMutableArray.

0 голосов
/ 24 июля 2011

Хорошо, я понял:

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

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];

    NSLog(@"path='%@'",path);

    NSFileManager *nfm = [[NSFileManager alloc] init];
    if([nfm fileExistsAtPath:path])
    {

        // if file exists, get its contents, add more entries and write back

        NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path];
        NSArray *keys = [NSArray arrayWithObjects:@"4",@"5",@"6",nil]; 
        [array addObject:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSString stringWithFormat:@"%@",lab.text],[NSString stringWithFormat:@"%@",lab1.text],[NSString stringWithFormat:@"%@",lab2.text], nil] forKeys:keys]]; 
        NSLog(@"modified array=%@",array);
        BOOL ok = [array writeToFile:path atomically:YES];
        if(!ok){
            NSLog(@"Unable to write appended file");
            return;
        }

    } else {

        // if file doesn't exist, create a new one

        NSMutableArray *array = [[NSMutableArray alloc] init];
        NSArray *keys = [NSArray arrayWithObjects:@"1",@"2",@"3",nil]; 
        [array addObject:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSString stringWithFormat:@"%@",lab.text],[NSString stringWithFormat:@"%@",lab1.text],[NSString stringWithFormat:@"%@",lab2.text], nil] forKeys:keys]]; 
        NSLog(@"new array=%@",array);
        BOOL ok = [array writeToFile:path atomically:YES];
        if(!ok){
            NSLog(@"Unable to write new file");
            return;
        }
    }
0 голосов
/ 20 июля 2011

Используйте NSMutableArray, к которому вы добавляете каждый новый объект словаря, а затем записываете этот массив в data.plist.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...