Сохранение данных в файл plist - PullRequest
1 голос
/ 25 августа 2010

У меня небольшие проблемы с сохранением в plist-файле, когда я читаю данные, которые я использую:

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return amounts.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //Create Cell
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];

    //Fill cell
    NSDictionary *budgetItem = [amounts objectAtIndex:indexPath.row];
    cell.textLabel.text = [budgetItem objectForKey:@"value"];
    cell.detailTextLabel.text = [budgetItem objectForKey:@"description"];

    //Return it
    return cell;
}

- (void) loadData{

    // Load items
    NSString *error;
    NSPropertyListFormat format;
    NSString *localizedPath = [[NSBundle mainBundle] pathForResource:@"savebudget" ofType:@"plist"];
    NSData *plistData = [NSData dataWithContentsOfFile:localizedPath];

    NSArray *amountData = [NSPropertyListSerialization propertyListFromData:plistData
                                                         mutabilityOption:NSPropertyListImmutable
                                                                   format:&format
                                                         errorDescription:&error];
    if (amountData) {
        self.amounts = [[NSMutableArray alloc] initWithCapacity:[amountData count]];
        for (NSDictionary *amountsDictionary in amountData) {
            [self.amounts addObject:amountsDictionary];
    }
}

Который отлично работает из статического файла plist в моей папке ресурсов, но когда я пытаюсь создать свой собственный файл, ничего не происходит:

-(void) addData { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"saveBudget" ofType:@"plist"];
    NSMutableDictionary* plist = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
    [plist setValue:amountTxt.text forKey:@"value"];
    [plist writeToFile:path atomically:YES];
    [plist release];

}

- (IBAction)add:(id)sender {
    [self addData]; 
    [self.delegate budgetEnterMinusViewControllerDidFinish:self];
}

Любая помощь более чем приветствуется ...

1 Ответ

2 голосов
/ 25 августа 2010

Тьфу.Страшный и запутанный код.Во-первых: используйте это для загрузки вместо:

NSString* path = [[NSBundle mainBundle] pathForResource:@"savebudget" ofType:@"plist"];

NSDictionary* amountData = [NSDictionary dictionaryWithContentsOfFile: path error: NULL];
if (amountData) {
    self.amounts = [NSMutableArray arrayWithArray: amountData];
}

Обратите внимание, что здесь нет retain или alloc / init, потому что вы присваиваете сохраняющему свойству.1007 * Вы читаете список, который, как вы говорите, содержит массив словарей.Но затем, когда вы добавляете данные, вы пытаетесь записать один единственный словарь в тот же список.

Кроме того, в вашем методе addData вы фактически не добавляете никаких данных.

И... Если вы загружаете свои исходные данные из пакета вашего приложения, то вы должны записать их обратно в каталог ~/Documents после изменения.И, конечно, прочитайте его оттуда при следующем запуске приложения.

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