PList Сценарий "курица / яйцо"

Я хочу читать / писать в cache.plist

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

path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathWithComponent@"cache.plist"];
NSMutableDictionary *root = ...

Но потом я хочу прочитать это с iPhone.

Не могу, папка "Ресурсы" доступна только для чтения.

Поэтому мне нужно использовать:

NSDocumentDirectory, NSUserDomain,YES

Итак, как я могу предварительно установить свой файл plist в каталог документов?

Это означает, что мне не нужно возиться с неопрятным кодом, копируя файл plist заново при запуске. (Если только это не единственный способ).


person David van Dugteren    schedule 18.05.2010    source источник


Ответы (3)


Я знаю, что это не совсем то, что вам нужно, но, насколько мне известно, единственный способ поместить документ в папку «Документы» - это скопировать его туда ... но только при первом запуске. Я собираюсь сделать что-то подобное для базы данных sqlite. Код ниже, он работает, но обратите внимание, что его можно немного очистить:

// Creates a writable copy of the bundled default database in the application Documents directory.
- (void)createEditableCopyOfDatabaseIfNeeded {
    // First, test for existence.
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"WordsDatabase.sqlite3"];
    createdDatabaseOk = [fileManager fileExistsAtPath:writableDBPath];
    if (createdDatabaseOk) return;
    // The writable database does not exist, so copy the default to the appropriate location.
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"WordsDatabase.sqlite3"];
    createdDatabaseOk = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
}

Просто позвоните в свой AppDelegate - правда, не так уж и беспорядочно?

person Ben Williams    schedule 18.05.2010

Легкий. Сначала посмотрите, есть ли он в каталоге документов. Если это не так, найдите его в папке ресурсов вашего приложения (_ 1_), затем скопируйте его в каталог документов, используя _ 2_. Затем безнаказанно пользуйтесь свежей копией в справочнике документов.

person Dave DeLong    schedule 18.05.2010
comment
Примо, я думаю, что оба ответа - это более или менее то, что мне нужно было услышать, вроде как проверка на вменяемость. Спасибо Дэйву Делонгу и alku83 - person David van Dugteren; 18.05.2010

Конечный продукт

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"Cache.plist"];


NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *giveCachePath = [documentsDirectory stringByAppendingPathComponent:@"Cache.plist"];


BOOL fileExists = [fileManager fileExistsAtPath:giveCachePath];

if (fileExists) {
    NSLog(@"file Exists");
}
else {
    NSLog(@"Copying the file over");
    fileExists = [fileManager copyItemAtPath:finalPath toPath:giveCachePath error:&error];
}

NSLog(@"Confirming Copy:");

BOOL filecopied = [fileManager fileExistsAtPath:giveCachePath];

if (filecopied) {
    NSLog(@"Give Cache Plist File ready.");
}
else {
    NSLog(@"Cache plist not working.");
}
person David van Dugteren    schedule 18.05.2010