Основные данные не работают на устройстве, но хорошо на симуляторе
Я использую основные данные для своего приложения. Он отлично работает на симуляторе, но не получает информацию о реальном устройстве. Устройство 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