2012-04-02 3 views
0

Когда мое приложение запускается первым, я использую простой код для чтения в некоторых данных из источника, а затем сохраняю его на основные данные, которые будут считаны в будущем. Вот мой метод applicationDidFinishLaunching:Сохранение импортированных данных в Core Data - Не удается прочитать обратно

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    categories = [[NSMutableArray alloc] init]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if (![defaults objectForKey:@"dataImported"]) { 
     NSMutableArray *temp_Categories = [[NSMutableArray alloc] initWithObjects:@"Food & Drink", @"Medical", @"Hotel", @"Travel", nil]; 

     for(int i = 0; i < [temp_Categories count]; i++){ 
      //Insert a new object of type ProductInfo into Core Data 
      NSManagedObject *categoryInfo = [NSEntityDescription 
               insertNewObjectForEntityForName:@"Category" 
               inManagedObjectContext:self.managedObjectContext]; 

      //Set category entities values 
      [categoryInfo setValue:[temp_Categories objectAtIndex:i] forKey:@"categoryName"]; 

      [categories addObject:[temp_Categories objectAtIndex:i]]; 
     } 

     [defaults setObject:@"OK" forKey:@"dataImported"]; 
     [defaults synchronize]; 

     NSLog(@"Imported"); 
    } 
    else { 
     //read from core data 
     NSError *error; 
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription 
             entityForName:@"Category" inManagedObjectContext:self.managedObjectContext]; 
     [fetchRequest setEntity:entity]; 
     NSMutableArray *temp_Categories = [[NSMutableArray alloc] initWithArray:[self.managedObjectContext executeFetchRequest:fetchRequest error:&error]]; 

     for (int i = 0; i < [temp_Categories count]; i++){ 
      NSString *category = [[temp_Categories objectAtIndex:i] objectForKey:@"categoryName"]; 
      [categories addObject:category]; 
      NSLog(@"Success"); 
     } 

     NSLog(@"Read From Core"); 
    } 

    return YES; 
} 

Когда я запускаю этот код в самый первый раз, он работает правильно, но когда я запускаю его в будущем (когда она считывается из основных данных) он не работает, это Безразлично» t читается в массиве из основных данных и temp_Categories count = 0. Может ли кто-нибудь объяснить, что я делаю неправильно? У меня такая же проблема, когда я пытаюсь сделать то же самое с файлом plist в другом приложении.

Спасибо,

Джек

EDIT 1 Я использую IOS 5.

EDIT 2 Скриншот модель данных: Data Model

+0

Вы получаете предупреждение в этой строке? NSMutableArray * temp_Categories = [[NSMutableArray alloc] initWithArray: [self.managedObjectContext executeFetchRequest: fetchRequest error: & error]]; –

+0

Нет, нет предупреждения. –

+0

Попробуйте эту строку: NSMutableArray * temp_Categories = [[NSMutableArray alloc] initWithArray: [self.managedObjectContext executeFetchRequest: ошибка fetchRequest: & error] mutableCopy]; –

ответ

0

мне удалось заставить его работать с этим:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    categories = [[NSMutableArray alloc] init]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if (![defaults objectForKey:@"dataImported"]) { 
     NSMutableArray *temp_Categories = [[NSMutableArray alloc] initWithObjects:@"Food & Drink", @"Medical", @"Hotel", @"Travel", nil]; 

     for(int i = 0; i < [temp_Categories count]; i++){ 
      //Insert a new object of type Category into Core Data 
      NSManagedObject *categoryInfo = [NSEntityDescription 
              insertNewObjectForEntityForName:@"Category" 
              inManagedObjectContext:self.managedObjectContext]; 

      //Set category entities values 
      [categoryInfo setValue:[temp_Categories objectAtIndex:i] forKey:@"name"]; 

      NSError *error; 
      if (![self.managedObjectContext save:&error]) { 
       NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
      } 

      NSLog(@"Added category to Core Data"); 

      //Add to global array 
      [categories addObject:[temp_Categories objectAtIndex:i]]; 
     } 

     [defaults setObject:@"OK" forKey:@"dataImported"]; 
     [defaults synchronize]; 

     NSLog(@"Imported"); 
    } 
    else { 
     //read from core data 
     NSError *error; 
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription 
             entityForName:@"Category" inManagedObjectContext:self.managedObjectContext]; 
     [fetchRequest setEntity:entity]; 
     NSMutableArray *temp_Categories = [[NSMutableArray alloc] initWithArray:[self.managedObjectContext executeFetchRequest:fetchRequest error:&error]]; 

     for (NSManagedObject *object in temp_Categories){ 
      [categories addObject: [object valueForKey:@"name"]]; 
     } 

     NSLog(@"Read From Core"); 
    } 

    return YES; 
} 

Спасибо за вашу помощь.

1

Попытаться вы звоните

NSError* error = nil; 
if (![self.managedObjectContext save:&error]) { 
    NSLog(@"Failed to save: %@, %@", error, [error userInfo]); 
} 

после установки вашего объекта ...

0

Вы должны вызвать метод сохранения .. Для того, чтобы сохранить изменения в persistent store вы должны вызвать метод save. До тех пор изменения только временно присутствуют на вашем scratch board/ ManagedObjectContext.

Добавить метод сохранения после этой строки:

[categoryInfo setValue:[temp_Categories objectAtIndex:i] forKey:@"categoryName"]; 

Сохранить метод:

NSError *error; 

if (![managedObjectContext save:&error]) 
{ 
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
} 

и я не знаю, эта линия работает правильно или нет в еще части ..

NSString *category = [[temp_Categories objectAtIndex:i] objectForKey:@"categoryName"]; 

Попробуйте эту строку вместо этого.

Category *currentCategory = (Category *)[temp_Categories objectAtIndex:i]; 
    [categories addObject:currentCategory.categoryName]; 
Смежные вопросы