获取 NSManagedObject 未保存

Posted

技术标签:

【中文标题】获取 NSManagedObject 未保存【英文标题】:Fetching NSManagedObject not saved 【发布时间】:2015-06-26 13:49:58 【问题描述】:

我试图从 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;
   

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢谢谢谢谢!今天我花了一天的大部分时间试图追踪一个奇怪的错误,在最终遇到这个答案后我发现了问题,我正在存储 NSNumbers 但在查询时在谓词中使用 NSString 值。我正要求助于在任何 fetchRequest 之前保存 MOC 的肮脏解决方法。幸好你救了我!【参考方案2】:

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

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

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

[myFetchRequest setIncludesPendingChanges:YES];

Apple Doc

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

【讨论】:

我添加了获取 managedContext 的方法。这是一个延迟加载,但我实际上它必须对 managedContext 做一些事情,在某些时候它会改变,但我不知道如何或为什么。我还添加了 setIncludesPendingChanges,但它仍然没有找到该事件。 为了增加更多的巫术,如果我通过另一个属性获取,比如名字,它会获取适当的事件。 您能否验证“事件”类的“id_server”属性设置是否正确?还要确保您在 NSPredicate 中测试的“aIdServer”不是“nil”。

以上是关于获取 NSManagedObject 未保存的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 中未保存的 NSSet 成员是不是会在保存时保留已删除的成员?

为啥在关闭/打开应用程序后未保存的修改后的 NSManagedObject 在 isUpdated 上返回 FALSE?

在 NSManagedObject 类中获取和保存数据的函数

核心数据 NSManagedObject - ObservedObjects 未更新

保存对 NSManagedObject 的更改

具有未在模型中定义的附加属性的 NSManagedObject 子类