получение данных из plist в NSMutableArray и запись NSMutableArray в тот же plist iPhone

Используя этот код, я пытаюсь получить данные из файла Templates.plist, но получаю нулевое значение в массиве.

//from plist
NSString *path = [[NSBundle mainBundle] pathForResource:@"Templates" ofType:@"plist"];
NSMutableArray *arry=[[NSMutableArray alloc]initWithContentsOfFile:path];

NSLog(@"arrayArray:::: %@", arry);

Это мой файл plist:

Plist-файл

Также я хочу знать, как добавить больше строк в этот файл plist и удалить строку из этого plist.


person Omer Waqas Khan    schedule 08.02.2012    source источник


Ответы (3)


Во-первых, вы не можете ничего писать в mainBundle. Чтобы вы могли написать в свой plist, вам нужно скопировать его в каталог документов. Делается это так:

- (void)createEditableCopyOfIfNeeded 
{
     // First, test for existence.
     BOOL success;

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

     if (success) 
         return;

     // The writable file does not exist, so copy from the bundle to the appropriate location.
     NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Template.plist"];
     success = [fileManager copyItemAtPath:defaultPath toPath:writablePath error:&error];
     if (!success) 
         NSAssert1(0, @"Failed to create writable file with message '%@'.", [error localizedDescription]);
}

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

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:@"Template.plist"];

Чтобы получить данные из plist:

NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath];

Чтобы записать файл обратно в каталог документов.

    [array writeToFile:filePath atomically: YES];
person Jaybit    schedule 08.02.2012
comment
не удалось получить нулевое значение для массива, я добавил ваш метод - (void) createEditableCopyOfIfNeeded, а затем вызвал его из представления DidLoad, как [self createEditableCopyOfIfNeeded], после вызова этой функции я использовал ваш код для чтения файла plist, но получил нулевое значение - person Omer Waqas Khan; 09.02.2012
comment
Однажды я столкнулся с этой проблемой. Возможно, вам придется сбросить симулятор. Что делает этот код, так это то, что если там уже есть файл с именем Template.plist, он не переопределит его. Поэтому, если файл уже есть, этот код не будет работать для вас, пока вы его не удалите. Это можно сделать, запустив симулятор, щелкнув меню симулятора iOS и нажав кнопку сброса содержимого и настроек. Это очистит симулятор. Другие варианты: использовать NSLog(@%@, filePath); и просто следуйте по пути, пока не найдете файл и не удалите его. - person Jaybit; 09.02.2012

Чтобы получить plist в изменяемый массив, используйте этот метод класса:

NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:path];

Затем добавьте/удалите строки из массива. Чтобы сохранить массив обратно в plist, используйте:

[array writeToFile:path atomically:YES];
person colby    schedule 08.02.2012

person    schedule
comment
спасибо, КАРИМ МАХАММЕД, не могли бы вы дать мне ссылку на этот учебник, чтобы я узнал, что происходит в этом коде - person Omer Waqas Khan; 08.02.2012
comment
Используя метод запуска, вы получаете все значения. Точно так же, создав метод, вы добавите новые поля в свой plist-файл. - person KAREEM MAHAMMED; 08.02.2012
comment
Здесь вы должны использовать NSString вместо NSMutableDictinory. - person KAREEM MAHAMMED; 08.02.2012
comment
попробовал ваш код, но он не возвращает никаких значений в массиве. Пусто - person Omer Waqas Khan; 08.02.2012