获取 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 类中获取和保存数据的函数