如何从 NSManaged 对象上下文中获取数据

Posted

技术标签:

【中文标题】如何从 NSManaged 对象上下文中获取数据【英文标题】:How to fetch data from NSManaged object context 【发布时间】:2014-04-01 05:35:58 【问题描述】:
NSFetchRequest *fetchLLObjects = [[NSFetchRequest alloc] init];

[fetchLLObjects setEntity:[NSEntityDescription entityForName:@"CustomerOrder" inManagedObjectContext:self.managedObjectContext]];

[fetchLLObjects setIncludesPropertyValues:NO]; //only fetch the managedObjectID



NSError *error = nil;

NSArray *allObjects = [self.managedObjectContext executeFetchRequest:fetchLLObjects error:&error];

这里的数组显示为零。但是在数据库中我可以看到有数据。不知道是什么原因。

【问题讨论】:

注释掉 setIncludesPropertyValues:NO。结果还是 nil 吗? 是的,我仍然得到 nil 值。 获取请求后错误对象是否为零? 【参考方案1】:

请在 fetchrequest 中添加您的谓词

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CustomerOrder"
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"managedObjectID == %@", managedObjectID]]                                          inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];

【讨论】:

我对这个 ios 很陌生。请告诉我如何获取 managedObjectID 设置谓词是可选的,这不是问题。【参考方案2】:

设置以下 2 个属性,您就完成了。

fetchRequest.returnsDistinctResults = YES;
fetchRequest.resultType = NSDictionaryResultType;

希望这会有所帮助。

编辑

   NSFetchRequest *fetchRequest= [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Songs" inManagedObjectContext:myManagedObjectContext];

//Take properties dictionary
NSDictionary *entityProperties = [entity propertiesByName];
[fetchRequest setEntity:entity];
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"song_type"]]];
NSArray * result = [myManagedObjectContext executeFetchRequest:fetchRequest error:nil];

【讨论】:

对于 NSDictionary *entityProperties 也显示为零。【参考方案3】:

你说:“但是在数据库中我可以看到有数据。”

我对这种说法持怀疑态度。我怀疑核心数据存储中不存在CustomerOrder 对象。 “查看”存储内数据的唯一方法是关闭日志模式并使用 3rd 方软件在 .sqlite 文件中达到峰值。

尽管其他人说了什么,但您的 fetch 请求很好。因此,请仔细检查将对象插入存储并保存到上下文的代码。

【讨论】:

以上是关于如何从 NSManaged 对象上下文中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XCode 调试器中调试 NSManagedObjects?

PHPhotos 和核心数据。 PHObject 使用啥 NSManaged 对象类型?

如何使用 @selector 和 NSInvocation 从另一个对象调用 NSManaged 对象的 @dynamic 方法?

如何将@NSManaged 对象类中的变量初始化为 JSON 值?

NSManaged 对象 initWithCoder 错误

在 Core Data 中,NSManaged 对象上的 URI 属性类型应该用于啥?