Чтение / запись в файл plist, поставляемый в комплекте с приложением - PullRequest
1 голос
/ 26 сентября 2010

Я создаю надстройку для своего приложения, где пользователь может искать элемент в списке, который предварительно заполнен данными из файла .plist.Это NSDictionary.Если искомый пользователь не существует, пользователь может нажать кнопку «+» и добавить его, чтобы он был там в следующий раз.

Сначала я подумал, что это будет так же просто, как использовать NSUserDefaults., но возникает несколько проблем.

Чтобы включить список, я должен поместить его в пакет, но если он есть, я не могу добавить в него новые пары ключ / значение.Это я могу сделать только с файлами, расположенными в папке «Документы».

Так что я предполагаю, что мне нужно связать plist, а затем при первом запуске переместить его в папку с документами и получить к нему доступ.

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

Существует ли безопасный, понятный и правильный способ достижения функциональности, которую яопишите?

Спасибо за предоставленную помощь:)

Редактировать: **** фактический подход, какпредложено TheSquad и TomH *****

+ (NSMutableDictionary*) genericProducts {

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [documentPaths objectAtIndex:0];
    NSString *documentPlistPath = [documentsDirectory stringByAppendingPathComponent:@"GenericProducts.plist"];

    NSString *bundlePath = [[NSBundle mainBundle] bundlePath];  
    NSString *bundlePlistPath = [bundlePath stringByAppendingPathComponent:@"GenericProducts.plist"];


    if([fileManager fileExistsAtPath:documentPlistPath]){

        NSMutableDictionary *documentDict = [NSMutableDictionary dictionaryWithContentsOfFile:documentPlistPath];
        return documentDict;

    } else {

        NSError *error;
        BOOL success = [fileManager copyItemAtPath:bundlePlistPath toPath:documentPlistPath error:&error];

    if (success) {
        NSMutableDictionary *newlySavedDict = [NSMutableDictionary dictionaryWithContentsOfFile:documentPlistPath];
        return newlySavedDict;
    }

    return nil;
}

}

И для добавления нового продуктак списку:

+ (void) addItemToGenericProducts:(NSString*) newProduct {

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [documentPaths objectAtIndex:0];
    NSString *documentPlistPath = [documentsDirectory stringByAppendingPathComponent:@"GenericProducts.plist"];
    NSMutableDictionary *documentDict = [NSMutableDictionary dictionaryWithContentsOfFile:documentPlistPath];
    [documentDict setObject:newProduct forKey:[MD5Checksum cheksum:newProduct]];

    [documentDict writeToFile:documentPlistPath atomically:YES];

}

Ответы [ 2 ]

2 голосов
/ 26 сентября 2010

Содержимое каталога документов не изменяется при обновлении приложения.

Содержимое каталога документов удаляется при удалении приложения пользователем.

При запуске приложенияпервый раз напишите флаг в NSUserDefaults.При последующих запусках приложения проверьте наличие флага.(в качестве альтернативы вы можете просто проверить наличие plist в каталоге документов)

2 голосов
/ 26 сентября 2010

У меня были те же мысли с моей базой данных sqlite ...

В итоге я делаю именно это, копирую связанный файл в документы для возможности его изменения.Я сделал это проверка при каждом запуске, если файл существует, если нет, скопируйте его.Если вы обновляете свое приложение, папка с документами не будет сенсорной, это означает, что скопированный файл из предыдущей версии все еще будет присутствовать.вам придется справиться с этим в вашем приложении.Если вам нужно сделать это, я предлагаю вам использовать NSUserDefault, чтобы проверить, существовала ли предыдущая версия приложения раньше ...

...