核心数据提取返回意外结果

Posted

技术标签:

【中文标题】核心数据提取返回意外结果【英文标题】:Core Data Fetch Returns Unexpected Results 【发布时间】:2014-01-16 01:34:58 【问题描述】:

使用核心数据,我创建了一个 fetch,它应该始终返回单个对象(基于特定谓词),但不知何故它返回了多个对象。我想知道我对核心数据谓词/比较如何工作的理解是否存在缺陷。

我的模型相关部分的概述(对于电子邮件客户端)

Entity: Thread
Relevant Attributes: thread.folder, thread.threadId

Entity: Folder
Relevant Attributes: folder.threads, folder.name

在核心数据中,不同的线程可以有相同的线程id,但应该总是有一个 不同的文件夹。

Example: 

Thread 1: thread.threadId = 12345, thread.folder.name = @"inbox"
Thread 2: thread.threadId = 12345, thread.folder.name = @"important"

所以,我假设如果我获取一个线程 ID 为 12345 且文件夹名称为“收件箱”的线程,我应该只获得 1 个线程。但在上述情况下我得到 2。

这是我从核心数据中获取的方式:

- (Thread *)threadForFolder:(Folder *)folder threadId:(uint64_t)threadId

  NSFetchRequest *request = [[NSFetchRequest alloc] init];
 [request setEntity:[Thread entityDescriptionInManagedObjectContext:self.managedObjectContext]];
 [request setPredicate:[NSPredicate predicateWithFormat:@"threadId == %llu && folder == folder", threadId, folder]];

 NSArray *results = [self.managedObjectContext executeFetchRequest:request error:nil];
 //ARRAY RETURNS TWO VALUES!?

 //...more stuff

为什么这不起作用?

【问题讨论】:

【参考方案1】:

我想你只是有一个错字。你只是说文件夹==文件夹而不是使用你传入的参数。所以当然,文件夹总是等于文件夹。

 [request setPredicate:[NSPredicate predicateWithFormat:@"threadId == %llu && folder == %@", threadId, folder]];

【讨论】:

以上是关于核心数据提取返回意外结果的主要内容,如果未能解决你的问题,请参考以下文章

核心数据提取结果减少相关项目集

从 PHAsset 中提取元数据返回意外的 nil 值

SQL Server 全文搜索返回意外结果

Informix SQL - 简单选择查询返回意外结果

Object.keys() 从集合中返回 MongoDB 对象上的意外键 [重复]

NSFetchedResultsController 啥都不返回