如何从 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 对象上下文中获取数据的主要内容,如果未能解决你的问题,请参考以下文章