使用 NSPredicate 的 FetchRequest 找不到结果?

Posted

技术标签:

【中文标题】使用 NSPredicate 的 FetchRequest 找不到结果?【英文标题】:FetchRequest with NSPredicate not finding results? 【发布时间】:2015-08-23 08:32:53 【问题描述】:

我将数据存储在包含“名称”和“系列”列的表中。我正在使用这个 NSPredicate 来查询:

var request : NSFetchRequest = NSFetchRequest(entityName: "Entry")
request.returnsObjectsAsFaults = false
request.predicate = NSPredicate(format: "name = %@ AND series = %@", name, series)
return request

'name' 和 'series' 变量作为字符串参数传入,它们也是表上的数据类型。

由于某种原因,此查询不返回任何数据。如果我在没有指定谓词的情况下对该表执行获取请求,我可以看到数据确实存在。我不确定我做错了什么。

为了它的价值,我尝试将条件句括在括号中,但这似乎也没有什么不同。提前致谢!

更新:我尝试了许多不同的方法,但到目前为止没有任何效果。我真的很难过。

不管怎样,我似乎和这个人有同样的问题:NSPredicate Returns No Results with Fetch Request, Works with Array Filtering

但是,该条目上没有任何内容具体说明问题的解决方案是什么。

【问题讨论】:

字符串完全匹配?包括大写和空格?您是否真的在寻找完全匹配或部分匹配的大小写宽大? 完全匹配,所有数据由应用控制,无需用户输入。 您需要显示有关模型、请求和示例数据的更多信息。大概没有错误从获取? 尝试仅使用nameseries 创建谓词。可能有助于定位错误。 有一些方法可以帮助您调试查询:第一种是使用 Xcode 标志 [waynehartman.com/posts/…(-com.apple.CoreData.SQLDebug 1) 调试/跟踪针对底层 sqlLite db 执行的查询。第二种是使用[github.com/ChristianKienle/Core-Data-Editor](Core数据编辑器)查看数据库中究竟包含哪些数据 【参考方案1】:

您可以通过以下方式检查数据是否存在

    将应用程序文档目录的 URL 打印到控制台。 在终端进入这个目录 运行sqlite3 <databaseName> 正在尝试select * from z<entityName> where name = '<nameData>'

您将能够探索数据并检查它是否包含您期望的内容。不要忘记检查代码中nameseries 变量的内容。

【讨论】:

我去了数据库……所有的数据都在那里。我打开 SQL 调试跟踪并运行核心数据正在运行的相同查询......它发现记录没有问题。我已经束手无策了。 你检查变量了吗?您能否将变量的值发布到您的问题中并报告与实际数据库内容的比较结果? 我检查了它们,据我所知,它们完全相同相同。除非那里有我看不到的额外字符(空格?)我真的很茫然。我运行了我的选择查询并准确地输入了名称。也许我在这一点上对差异视而不见,因为我已经盯着它看了很长时间。【参考方案2】:

哦哇...非常感谢大家的所有回答。最后发现,当我填充 id 以向表中插入新行时,我正在查看另一个表来计算新的主键 id。

所以我正在覆盖现有记录,这就是我的查询一直失败的原因。

孩子们,如果你在没有严格检查的情况下复制/粘贴你的代码,你会过得很糟糕。

【讨论】:

以上是关于使用 NSPredicate 的 FetchRequest 找不到结果?的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 101:将 NSPredicate 与自定义对象的 NSMutableArray 一起使用

NSPredicate 的使用

使用 NSPredicateEditor 编辑 NSPredicate

NSPredicate 与具有多个对象的 Array 一起使用

NSPredicate 使用 RLMResults 作为参数

使用 NSPredicate 搜索 NSArray