Основные данные не работают на устройстве, но хорошо на симуляторе

Я использую основные данные для своего приложения. Он отлично работает на симуляторе, но не получает информацию о реальном устройстве. Устройство iOS6.1. Это код, который я использую:

- (NSManagedObjectContext *) getCurrentMangedContext
{
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"ForceData" withExtension:@"momd"];
    NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];  

    NSURL *storeURL =  [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]URLByAppendingPathComponent:@"ForceData.sqlite"];

    NSError *error = nil;
    NSPersistentStoreCoordinator *persistantStroreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
    if (![persistantStroreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    {

    }
    NSManagedObjectContext *managedContext = [[NSManagedObjectContext alloc] init] ;
    [managedContext setPersistentStoreCoordinator:persistantStroreCoordinator];
    modelURL = nil;
    return  managedContext;
}

Это то, как я сохраняю свои данные для входа, и это не дает никакой ошибки.

 NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context];
  [request setEntity:entity];
  NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
    if (emailString != nil)
    {
       [newManagedObject setValue:emailString forKey:@"email"]; 
    }
    if (genderString != nil)
    {
        [newManagedObject setValue:genderString forKey:@"gender"]; 
    }
    if (fNameString != nil)
    {
        [newManagedObject setValue:fNameString forKey:@"firstName"]; 
    }
    if (lNameString != nil)
    {
        [newManagedObject setValue:lNameString forKey:@"lastName"]; 
    }
   if (userIDString != nil)
    {
        [newManagedObject setValue:userIDString forKey:@"userID"]; 
    }
  NSError *error = nil;
    if (![context save:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    // Insert User details to the user DB <--------------------------

И вот как я получаю:

- (User *) getActiveUser 
{
    NSManagedObjectContext *context = [self getCurrentMangedContext];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context];
    [request setEntity:entity];

    NSError *errorFetch = nil;
    NSArray *array = [context executeFetchRequest:request error:&errorFetch];
    User *objUser = (User *) [array lastObject];
    NSLog(@"%@",objUser);

    return objUser;
}

Но я не получаю детали пользователя на устройстве, но получаю на симуляторе. Кто-нибудь сталкивался с таким же?

1 ответ

Решение

В вашем случае я бы предложил, чтобы ARC выпустила ваш managedObjectContext после выполнения запроса на выборку.

Убедитесь, что вы держите strong ссылка на соответствующий managedObjectContext в течение всей жизни вашего managedObject где-то в вашем приложении (например, ваш ApplicationDelegate). NSManagedObject не может жить без его управляемого ObjectContext. Шаблон проекта Core Data показывает, как это сделать.

Дополнительная информация о ARC и сильные ссылки: https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

Другие вопросы по тегам