Как сохранить строку Nested Array / JSON в файле .plist? - PullRequest
1 голос
/ 02 февраля 2012

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

Итак, какой у меня вопрос Могу ли я сохранить сложную структуру или вложенный массив, вложив словарь в файл plist?

enter image description here

Ниже приведен фрагмент кода, который я использую для локального хранения. Используя этот код, .plist успешно создается в каталоге документов приложения, доступном в Simulator.

-(NSString *)Return_PlistPathCreation
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *libraryPath = [paths objectAtIndex:0];    
    NSString *plistPath = [libraryPath stringByAppendingPathComponent:@"LoadedNews.plist"];

    // Checks if the file exists at the writable location.
    if ( ![[NSFileManager defaultManager] fileExistsAtPath:plistPath] ) {
        NSString *masterFilePath = [[NSBundle mainBundle] pathForResource:@"LoadedNews" ofType:@"plist"];

        // Try to copy the master file to the writable location
        NSError *error;
        if ( ![[NSFileManager defaultManager] copyItemAtPath:masterFilePath toPath:plistPath error:&error] ) {
            NSLog(@"Error: %@", [error localizedDescription]); 
            // Serious error.
        }

    }
    return plistPath;
}

Ниже кода для записи данных Array. Но в файл ничего не записывается. Если я использую Dicrtionary с парой значений ключа множественного числа, я могу записать содержимое в тот же файл plist .

//This code works perfectly.
NSArray *arr =[NSArray arrayWithObjects:@"ajay",@"sharma",nil];
NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
[dict setValue:arr forKey:@"FullName"];
[[dict JSONRepresentation] writeToFile:plistPath atomically:YES encoding:NSASCIIStringEncoding error:nil];

Но тот же код не работает для моего массива, который проанализировал содержимое внутри него.

NSArray *arr =[NSArray arrayWithArray:ComplexDataArray];
NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
[dict setValue:arr forKey:@"Data"];
[[dict JSONRepresentation] writeToFile:plistPath atomically:YES encoding:NSASCIIStringEncoding error:nil];

Может кто-нибудь подсказать мне, в чем проблема записи данных в файл .plist.

Заранее спасибо ....

Ответы [ 2 ]

2 голосов

попробуй вот так

  NSMutableArray *types = [NSMutableArray array];


for (int i=0; i<jsonArray.count; i++) {
   NSString *t_ID = [[jsonArray objectAtIndex:i] valueForKey:@"id"];
   NSString *image = [[jsonArray objectAtIndex:i] valueForKey:@"image"];
   NSString *name =[[jsonArray objectAtIndex:i] valueForKey:@"name"];
   NSArray *dictArray = [NSArray arrayWithObjects:t_ID,image,name, nil];
   NSArray *dictKeys = [NSArray arrayWithObjects:@"id",@"image",@"name", nil];
 NSDictionary*  dict = [NSDictionary dictionaryWithObjects:dictArray forKeys:dictKeys];
   [types addObject:dict];
}
NSDictionary*  plistDict = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects:types, nil] forKeys:[NSArray arrayWithObjects:@"ptype", nil]];
NSString *error = nil;
NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];


if(plistData)
{
    [plistData writeToFile:appDelegate.plistPath atomically:YES];
}
else
{
    NSLog(@"Error log: %@", error);

}
2 голосов

если вы используете NSLog, результат ошибки должен выглядеть следующим образом: Ошибка в saveData: список свойств недопустим для формата (списки свойств не могут содержать объекты типа 'CFNull')

...