2012-02-08 2 views
0

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

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

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

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

Plist file

Кроме того, я хочу знать, как я могу добавить больше строк в этом Plist файл и удалить строку из этого списка свойств.

ответ

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"]; 

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

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

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

[array writeToFile:filePath atomically: YES]; 
+0

нет успеха, все еще получая нулевое значение для массива, я добавил ваш метод - (void) createEditableCopyOfIfNeeded, а затем вызвал его из представления DidLoad, поскольку [self createEditableCopyOfIfNeeded] после вызова этой функции я использовал ваш код для чтения plist файл, но получение нулевого значения –

+0

Я столкнулся с этим вопросом один раз. Что вам может понадобиться, это сбросить симулятор. Что делает этот код, так это если файл уже там называется Template.plist, он не будет его переопределять. Поэтому, если файл уже существует, этот код не будет работать для вас, пока вы его не удалите. Это можно сделать, запустив симулятор и нажав меню iOS simulator и нажав кнопку сброса и настройки. Это очистит симулятор. Другие опции - использование NSLog (@ "% @", filePath); и просто следуйте по пути, пока не найдете файл и не удалите его. – Jaybit

2
-(NSMutableArray *)start1 

{ 

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"Templates.plist"]; 



if ([[NSFileManager defaultManager] fileExistsAtPath:plistPath]){ 

    plistArr = [NSMutableArray arrayWithContentsOfFile: plistPath]; 

} 
else { 
    plistArr = [[NSMutableArray alloc] init]; 

} 
return plistArr; 
} 


- (void)createNewRecordWithName:(NSMutableDictionary *)dict 

{ 

plistArr=[self start1]; 
[plistArr addObject: dict]; 
//[dict release]; 
[self writeProductsToFile:plistArr]; 

} 

    - (void)writeProductsToFile:(NSMutableArray *)array1 { 

    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

    NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"Template.plist"]; 

[array1 writeToFile:plistPath atomically:YES]; 

    } 
+0

Thanx Карим Мухаммед, пожалуйста, вы можете сказать мне ссылку на этот учебник, чтобы я пришел, чтобы узнать, что, что происходит в этом коде –

+0

Используя метод запуска вы получаете все значения. SImilarly путем createMethod вы собираетесь добавить новые feilds в ваш файл plist –

+0

Здесь вы должны использовать NSString вместо NSMutableDictinory –

0

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

NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:path]; 

Затем добавить/удалить строки из массива. Для того, чтобы сохранить массив обратно в PLIST, используйте:

[array writeToFile:path atomically:YES]; 
Смежные вопросы