PList Цыпленок / Сценарий Яйца - PullRequest
0 голосов
/ 18 мая 2010

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

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

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

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

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

Так что мне нужно использовать:

NSDocumentDirectory, NSUserDomain,YES

Так как мне предварительно установить мой plist-файл в папку «Каталог документов»?

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

Ответы [ 3 ]

1 голос
/ 18 мая 2010

Легко. Сначала посмотрите, находится ли он в каталоге документов. Если это не так, найдите его в папке ресурсов вашего приложения ([[NSBundle mainBundle] pathForResource...]), а затем скопируйте его в каталог документов, используя [[NSFileManager defaultManager] copyItemAtPath:...]. Тогда безнаказанно используйте свежую копию в каталоге документов.

1 голос
/ 18 мая 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.");
}
1 голос
/ 18 мая 2010

Я знаю, что это не то, что вам нужно, но, насколько мне известно, единственный способ поместить документ в папку «Документы» - это скопировать его туда… но только при первом запуске. Я собираюсь что-то подобное для базы данных 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 - не слишком ли грязно?

...