Сохранение импортированных данных в Core Data - не могу прочитать обратно - PullRequest
0 голосов
/ 02 апреля 2012

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

- (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;
}

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

Спасибо,

Джек

РЕДАКТИРОВАТЬ 1 Я использую iOS 5.

РЕДАКТИРОВАТЬ 2 Скриншот модели данных: Data Model

Ответы [ 3 ]

1 голос
/ 02 апреля 2012

Попробуй позвонить

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

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

0 голосов
/ 02 апреля 2012

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

- (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;
}

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

0 голосов
/ 02 апреля 2012

Вы должны вызвать метод save. Чтобы сохранить изменения в 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];
...