获取NSManagedObject未保存

时间:2015-06-26 13:49:58

标签: ios objective-c core-data

我试图获取一些我从JSON解析的对象,我不想保存它们,直到用户完成某些操作,但我想获取它们。 不保存它们意味着我无法在应用程序的不同运行中获取它们,但这没关系。 所以我像这样创建NSManagedObject。

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:[self managedObjectContext]];
NSManagedObject *event = [[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:[self managedObjectContext]];

然后我试图像这样获取它。

NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Event" inManagedObjectContext:[self managedObjectContext]];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"id_server == %@", aIdServer];

[fetchRequest setPredicate:testForTrue];

NSArray *arrayEvents = [[NSArray alloc]initWithArray:[[self managedObjectContext] executeFetchRequest:fetchRequest error:&error]];

id_server是一个唯一值,它永远不会返回一个实际存在的事件,因为如果我打印所有事件'在CoreData中,它使用id_server显示事件。

如果我保存上下文:

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

它可以找到事件,但是我可以在不保存上下文的情况下获取事件吗?

由于

[编辑]

我访问managedContext的方式如下:

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
     }

      NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
         _managedObjectContext = [[NSManagedObjectContext alloc] init];
         [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
   }

2 个答案:

答案 0 :(得分:0)

您创建的NSManagedObject类实例将仅与用于创建它们的NSManagedObjectContext保持关联,除非您将它们提交到持久存储。 因此,如果要获取相同的对象(不保存到持久存储),则需要引用用于创建它们的同一NSManagedObjectContext实例。

在您的代码中,[self managedObjectContext]每次调用时都会创建一个新的managedObjectContext,还是只返回相同的上下文? 如果它每次都创建一个新的managedObjectContext,那么您将获得NSManagedObjectContext的新实例,因此您将无法获取那些NSManagedObject个实例。

但是,如果它返回相同的NSManagedObjectContext实例,那么您可以使用

[myFetchRequest setIncludesPendingChanges:YES];

Apple Doc

这与托管对象上下文中当前未保存的更改相匹配。

答案 1 :(得分:0)

即使所有属性都设置正确,因为我打印了所有值并且它们是正确的,我做了一些奇怪的事情,设置为NSString最初(来自服务器)是一个int。 当我保存上下文时,提取工作正常,但是当我没有这样做时,不知怎的,成了一个问题。 更改该属性的类型(我正在研究的那个)解决了这个问题。