2014-02-04 3 views
0

В моем приложении мне нужно сохранить данные в файле plist файл для использования в другом UIViewController и сохранить крошечный db в приложении. Я сделал так:Не удалось создать файл plist в IOS

  1. я получаю информацию о том, что нужно хранить в этом файле
  2. я вставил эту информацию в NSDictionary
  3. Я вставил NSDictionary в NSMutableArray
  4. Теперь я сделал утилиту класс, который обрабатывает работу с файлом Но он не создает файл plist в каталоге Documents. Вот мой код:

ViewController.m

- (void)saveActivity { 
    if ([FileHander plistExist]) { 
     NSMutableArray *dataFromFile = [[NSMutableArray alloc]init]; 
     dataFromFile = [FileHander loadDataFromFile]; 
     if (![[dataFromFile lastObject]objectForKey:@"type"]) { 
      [FileHander saveFileWithArray:arrayActivity]; 
     } else { 
      [dataFromFile addObject:arrayActivity]; 
      [FileHander saveFileWithArray:dataFromFile]; 
     } 
    } else { 
     NSLog(@"%@", arrayActivity); 
     [FileHander saveFileWithArray:arrayActivity]; 
    } 
} 

arrayActivity содержит это (координаты, скорость, время и т.д. ...):

(
     { 
     coordinates =   (
      "<+45.44083526,+9.19919774> +/- 10.00m (speed 0.00 mps/course 71.02) @ 04/02/14 12:46:08 Ora standard dell'Europa centrale", 
      "<+45.44083561,+9.19919755> +/- 65.00m (speed -1.00 mps/course -1.00) @ 04/02/14 12:46:33 Ora standard dell'Europa centrale", 
      "<+45.44083612,+9.19919728> +/- 65.00m (speed -1.00 mps/course -1.00) @ 04/02/14 12:46:33 Ora standard dell'Europa centrale", 
      "<+45.44083663,+9.19919700> +/- 65.00m (speed -1.00 mps/course -1.00) @ 04/02/14 12:46:33 Ora standard dell'Europa centrale", 
      "<+45.44083714,+9.19919673> +/- 65.00m (speed -1.00 mps/course -1.00) @ 04/02/14 12:46:33 Ora standard dell'Europa centrale", 
      "<+45.44084181,+9.19917132> +/- 65.00m (speed -1.00 mps/course -1.00) @ 04/02/14 12:46:33 Ora standard dell'Europa centrale", 
      "<+45.44083100,+9.19919440> +/- 65.00m (speed -1.00 mps/course -1.00) @ 04/02/14 12:46:33 Ora standard dell'Europa centrale", 
      "<+45.44088744,+9.19913454> +/- 50.00m (speed 0.00 mps/course -1.00) @ 04/02/14 12:46:35 Ora standard dell'Europa centrale", 
      "<+45.44088744,+9.19913454> +/- 30.00m (speed 0.00 mps/course -1.00) @ 04/02/14 12:46:36 Ora standard dell'Europa centrale", 
      "<+45.44088744,+9.19913454> +/- 30.00m (speed 0.00 mps/course -1.00) @ 04/02/14 12:46:37 Ora standard dell'Europa centrale", 
      "<+45.44088744,+9.19913454> +/- 30.00m (speed 0.00 mps/course -1.00) @ 04/02/14 12:46:39 Ora standard dell'Europa centrale" 
     ); 
     speed =   (
     ); 
     steps = 16; 
     time = "00:00:08"; 
     type = Trekking; 
    } 
) 

класс утилита это :

FileHandler.m

#import "FileHander.h" 

@implementation FileHander 

+ (BOOL) plistExist { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    NSString *path = [documentsDir stringByAppendingPathComponent:@"activity.plist"]; 
    return [[NSFileManager defaultManager]fileExistsAtPath:path]; 
} 

+ (NSMutableArray *) loadDataFromFile { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    NSString *path = [documentsDir stringByAppendingPathComponent:@"activity.plist"]; 
    NSMutableArray *dataFound = [NSArray arrayWithContentsOfFile:path]; 
    return dataFound; 
} 

+ (BOOL) deletePlist { 
    NSFileManager *manager = [NSFileManager defaultManager]; 
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"activity.plist"]; 
    NSError *error; 
    BOOL success =[manager removeItemAtPath:filePath error:&error]; 
    if (success) { 
     return YES; 
    } 
    else 
    { 
     return NO; 
    } 
} 

+ (void) saveFileWithArray: (NSMutableArray*)activityArray { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *fileName = [documentsDirectory stringByAppendingPathComponent:@"activity.plist"]; 
    [activityArray writeToFile:fileName atomically:YES]; 
} 

@end 

Когда я исполню это приложение не может создать файл Plist на устройстве (я смотрел этот файл с помощью Mac App IEXPLORER), что не так в моем коде? Я использовал тот же код для разработки другого приложения, и он отлично работает. Надеюсь, вы поможете мне решить проблему. Спасибо

+1

Я бы предложил проверить возвращаемое значение из 'writeToFile: atomically: 'и распечатайте путь, который вы отправляете (' NSLog (@ "Path:% @", fileName) '), чтобы узнать, что может произойти. – gaige

+0

Я попытался запустить его на симуляторе и создать файл без координат и скорости (очевидно), почему он не запускается на устройстве? Я попробовал, и это показывает мне следующее: «PATH:/var/mobile/Applications/0874CD25-D82E-4FC4-BB5C-5302BE5DA95E/Documents/activity.plist' – lucgian841

+0

Трудно сказать, не проверив ошибки. Вы также можете сбросить ActivityArray, чтобы убедиться, что все типы могут быть правильно закодированы в plist. Это объясняет, почему пустой plist может быть записан, а один из записей не может быть. – gaige

ответ

1

Пожалуйста, попробуйте ниже код, чтобы создать файл Plist .. Я пробовал и работает хорошо ..

Создаёт файл с NSArray:

- (void) saveFileWithArray: (NSMutableArray*)activityArray { 
    NSData * data = [NSKeyedArchiver archivedDataWithRootObject:activityArray]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docDir = [paths objectAtIndex:0]; 

    NSString *Path =[NSString stringWithFormat:@"%@/%@.plist",docDir,@"isLogin"]; 
    NSLog(@"-->%@",Path);  // PATH OF YOUR PLIST FILE 
    BOOL didWriteSuccessfull = [data writeToFile:Path atomically:YES]; 
     if (didWriteSuccessfull) { 
      NSLog(@"store succsessfully"); 
      } 
    else { 
      NSLog(@"Error in Storing"); 
    } 
} 

GET NSArray из файла:

- (NSMutableArray *) loadDataFromFile { 
    NSArray *myArray=[[NSArray alloc]init]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docDir = [paths objectAtIndex:0]; 

    NSString *Path =[NSString stringWithFormat:@"%@/%@.plist",docDir,@"isLogin"]; 

    if ([[NSFileManager defaultManager] fileExistsAtPath:Path]) 
     { 
      NSLog(@"exist"); 
      myArray=[[NSArray alloc]initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:[NSData dataWithContentsOfFile:Path]]]; 
      return [NSMutableArray arrayWithArray:myArray]; 
     } 
     else{ 
      NSLog(@"not exist"); 
      return nil; 
     } 
} 
+0

Это действительно не создает файл plist так, как он хочет. Он создает файл plist с одним объектом данных, который хранится в plist.Он не обеспечивает столько диагностического использования, поскольку «данные», хранящиеся в plist, непрозрачны. – gaige

+0

@gaige: Вы правы .. путь отличается, но он может реализовать и преодолеть свою проблему. –

+0

@RahulPatel: так что он работает, но он создает очень сложный файл plist, очень трудно декодировать ... С помощью моих методов я создать очень простой файл plist очень легко декодировать ... – lucgian841

Смежные вопросы