Как записать данные в plist? - PullRequest
16 голосов
/ 25 мая 2009

Я создал save.plist в папке ресурсов. Я написал некоторые данные в этом непосредственно (без использования кодирования). Я могу прочитать эти данные, но не могу записать код в тот же save.plist. Используя следующий код, я пытаюсь записать данные, но они сохраняются в моем .app plist. Код здесь

NSString *errorDesc = nil;

NSPropertyListFormat format;

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"save" ofType:@"plist"];

NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];

NSMutableDictionary *temp = (NSMutableDictionary *)[NSPropertyListSerialization
                     propertyListFromData:plistXML
                              mutabilityOption:NSPropertyListMutableContainersAndLeaves
                  format:&format errorDescription:&errorDesc];

if (!temp) {

    NSLog(errorDesc);

    [errorDesc release];        
    }
    //  [temp setValue:@"123" forKey:@"line1"];
    //  [temp writeToFile:plistPath atomically: YES];

    //Reading data from save.plist
    NSLog([temp objectForKey:@"name"]);
    NSLog([temp objectForKey:@"wish"]);
    NSNumber *num=[temp valueForKey:@"roll"];
    int i=[num intValue];
    printf("%d",i);
        //writitng the data in save.plist

    [temp setValue:@"green" forKey:@"color"];
    [temp writeToFile:plistPath atomically: NO];
    NSMutableDictionary *temp1 = (NSMutableDictionary *)[NSPropertyListSerialization
                propertyListFromData:plistXML                                                            
                                mutabilityOption:NSPropertyListMutableContainersAndLeaves
                format:&format errorDescription:&errorDesc];

    NSLog([temp objectForKey:@"color"]);

Я хочу, чтобы данные, которые я хочу записать, записывались только в save.plist, который хранится в ссылках. Я новичок в этой концепции. Так что, если кто-нибудь знает, пожалуйста, помогите мне. Заранее спасибо. : -)

Ответы [ 6 ]

26 голосов
/ 25 мая 2009

Не знаю, понимаю ли я ваш вопрос, но если вы хотите написать в .plist в вашем пакете .app, вы, вероятно, делаете что-то не так. Если вы хотите сохранить настройки, вам следует рассмотреть возможность использования NSUserDefaults .
Если вы действительно хотите изменить пакетный .plist - вот код:

NSString *plistPath = nil;
NSFileManager *manager = [NSFileManager defaultManager];
if (plistPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Contents/Info.plist"]) 
{
    if ([manager isWritableFileAtPath:plistPath]) 
    {
        NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
        [infoDict setObject:[NSNumber numberWithBool:hidden] forKey:@"LSUIElement"];
        [infoDict writeToFile:plistPath atomically:NO];
        [manager changeFileAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] atPath: [[NSBundle mainBundle] bundlePath]];
    }
}

Обновление:
Нейт Флинк отметил, что некоторые из методов NSFileManager, использованных выше, устарели. Он опубликовал ответ с методами замены ниже: https://stackoverflow.com/a/12428472/100848

9 голосов
/ 14 сентября 2012

Обновленная версия оригинального удивительного примера от weichsel (спасибо!). XCode бросил пару предупреждений, одно из которых является устаревшим методом на NSFileManager. Обновлен здесь с помощью устаревших методов из iOS 5.1

    NSString *plistPath = nil;
NSFileManager *manager = [NSFileManager defaultManager];
if ((plistPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"mySpecial/PathTo.plist"])) 
{
    if ([manager isWritableFileAtPath:plistPath]) 
    {
        NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
        [infoDict setObject:@"foo object" forKey:@"fookey"];
        [infoDict writeToFile:plistPath atomically:NO];
        [manager setAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] ofItemAtPath:[[NSBundle mainBundle] bundlePath] error:nil];
    }
}
4 голосов
/ 26 мая 2009

Подводя итог некоторым другим ответам:

Ваша проблема в том, что вы пытаетесь записать файл обратно в папку, в которой находится ваше приложение. Эта папка недоступна для записи во время выполнения. Все, что вы делаете, хорошо, вам просто нужно выбрать другое место для записи вашего файла.

Вы можете использовать функцию NSSearchPathForDirectoriesInDomains, чтобы найти более подходящую папку для этих данных. (Например, папка @ "Documents".)

4 голосов
/ 25 мая 2009

Когда вы создаете приложение, оно создает исполняемый файл "appName.app", и все файлы создаются в комплекте. Поэтому вы не можете получить доступ к папке ресурсов, когда приложение запущено, поскольку все данные находятся в комплекте (не в папке).

Однако вы можете получить доступ к временной папке, которая содержит некоторую информацию о приложении. Вы можете найти временную папку здесь: Открыть поиск - нажмите на свое имя пользователя (в разделе МЕСТА) - Библиотека - Поддержка приложений - iPhone Simulator - Пользователь - Приложения - (здесь вы можете найти все временные папки ваших приложений iPhone)

Вы можете получить доступ к этой временной папке:

<code>
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

Если вы назовете свой файл save.plist, вы можете получить к нему доступ следующим образом:

<code>NSString *filePath = [documentsDirectory stringByAppendingString:@"_save.plist"];

Затем вы просто сохраняете свой файл в этом filePath, и он появится во временной папке с именем «Documents_save.plist».

* Обратите внимание, что имя временной папки меняется при каждом запуске приложения.

Рекомендую книгу для вас: Development Начало разработки iPhone - Изучение iPhone SDK》. В главе 11 вы можете найти то, что вы хотите.

1 голос
/ 01 апреля 2011

попробуйте это:

-(void)add:(NSRunningApplication *) app { 
   if ([self contains:app]) return; 
   [self.apps addObject:app.localizedName]; 
   [self.apps writeToFile:self.dataFile atomically:YES];
}

из "Программирование какао".

0 голосов
/ 06 января 2011

Вы должны скопировать свой лист в каталог документов ... потому что вы ничего не можете сохранить без сохранения в файл документа .... при копировании это позволит писать / изменять в plist

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