не могу сохранить плист. путь не доступен для записи

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

это мой метод загрузки пути и данных из plist. если файл в папке «поддержка приложений» не существует, я копирую его из 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. структура моего plist выглядит так: https://img.skitch.com/20111026-tcjxp9ha4up8ggtfjy7ucgqcqe.png

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


person Adrian    schedule 19.10.2011    source источник
comment
Это для приложения Mac OS X или приложения iOS?   -  person Jason Coco    schedule 19.10.2011
comment
Если вы хотите добавить дополнительную информацию к своему вопросу, просто отредактируйте свой вопрос (нажмите ссылку «Изменить» под своим вопросом). Чтобы прокомментировать полученный ответ, используйте средство комментирования под ответом. Если вы обнаружите, что места для комментариев недостаточно, вам, вероятно, следует внести правки. Ответы должны быть именно такими, прямыми ответами на ваш вопрос.   -  person Tim Post♦    schedule 27.10.2011


Ответы (3)


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

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

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

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

person Jason Coco    schedule 19.10.2011

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

person DShah    schedule 19.10.2011
comment
теперь папка доступна для записи. я доказал это с помощью: [fileManager isWritableFileAtPath:self.plistPath], но я все еще не могу сохранить plist: if([self.plist writeToFile:self.plistPath atomically:YES]) { NSLog(@"save ok"); return YES; } else { NSLog(@"save failed"); return NO; } - person Adrian; 20.10.2011
comment
Вы обновляете свой массив??? Вы записываете свой обновленный массив в plist??? И что возвращает последнее условие if ?? - person DShah; 20.10.2011

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

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

to

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

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

person Darktau    schedule 08.01.2012