не могу сохранить плист путь не доступен для записи - PullRequest
3 голосов
/ 19 октября 2011

Я сохраняю много информации в списке.Этот стандарт в моем mainBundle.

Это мой метод загрузки пути и данных из plist.если файл в папке «Application Support» не существует, я копирую его из mainBundle туда.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
self.plistPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",plistName]];


NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath: self.plistPath])
{
    NSString *pathInBundle = [[NSBundle mainBundle] pathForResource:plistName ofType:@"plist"];
    self.plist = [NSMutableDictionary dictionaryWithContentsOfFile:pathInBundle];
    NSLog(@"plist doesnt exist");
}
else {
    self.plist = [NSMutableDictionary dictionaryWithContentsOfFile:self.plistPath];
    NSLog(@"plist exist");
}
NSLog(@"plist path: %@",self.plistPath);

, если я добавляю следующие строки в конце, есть только NOответ:

if([fileManager isWritableFileAtPath:self.plistPath]) NSLog(@"YES");
else NSLog(@"NO");

В конце концов, я пытался сохранить с [self.plist writeToFile:self.plistPath atomically:YES];, который также не работает.


извините за ответ так поздно - у меня было многодругие вещи, чтобы сделать.Возвращаясь к моей проблеме: я получаю ошибку только при попытке добавить новую запись в свой словарь (plist).редактирование не проблема.Я думаю, проблема в том, как я пытаюсь добавить запись.мой код выглядит так:

NSMutableDictionary *updateDict = [[self.plist objectForKey:@"comments"]mutableCopy];

NSMutableDictionary *tmpDict = [[[NSMutableDictionary alloc]init]autorelease];  
[tmpDict setObject:comment forKey:@"comment"];
[tmpDict setObject:author forKey:@"author"];
[tmpDict setObject:car forKey:@"car"];
[tmpDict setObject:part forKey:@"part"];
[tmpDict setObject:date forKey:@"date"];

[updateDict setObject:tmpDict forKey:[NSNumber numberWithInt:[updateDict count]+1]];

[self.plist setObject:updateDict forKey:@"comments"];
if([self.plist writeToFile:self.plistPath atomically:YES]) {
    return YES;
}
else {
    return NO;
}

self.plist - это моя локальная копия файла на plistPath.структура моего списка выглядит следующим образом: https://img.skitch.com/20111026-tcjxp9ha4up8ggtfjy7ucgqcqe.png

надеюсь, это поможет

Ответы [ 3 ]

1 голос
/ 19 октября 2011

Хорошо, так что это не каталог «Документы», а в iOS по умолчанию нет каталога поддержки приложений, созданного в песочнице, поэтому вы не можете писать.

Вы можете либо изменить вызов методадля поиска каталога реальных документов:

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

Или, после того как вы получите путь к каталогу Application Support , вы должны проверить, существует ли он уже, а если нет,создать его.

0 голосов
/ 08 января 2012

Вы нашли ответ?если нет, вам нужно изменить эту строку:

[updateDict setObject:tmpDict forKey:[NSNumber numberWithInt:[updateDict count]+1]];

на

[updateDict setObject:tmpDict forKey:[NSString stringWithFormat:@"%d",[updateDict count]+1]];

Имя ключа - строка, а не объект.

0 голосов
/ 19 октября 2011

Пожалуйста, просмотрите предыдущий пост , в котором показан другой способ копирования plist из mainBundleВместо этого используйте метод [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];.

...