получение данных из plist в NSMutableArray и запись NSMutableArray в тот же plist iPhone - PullRequest
0 голосов
/ 08 февраля 2012

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

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

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

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

Plist file

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

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

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

- (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];
2 голосов
/ 08 февраля 2012
-(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 голосов
/ 08 февраля 2012

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

NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:path];

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

[array writeToFile:path atomically:YES];
...