NSFetchRequest 获取具有下一个最接近字符串属性的对象

Posted

技术标签:

【中文标题】NSFetchRequest 获取具有下一个最接近字符串属性的对象【英文标题】:NSFetchRequest fetch object with next closest string attribute 【发布时间】:2015-10-26 20:46:18 【问题描述】:

假设我有 5 个 Alphabet 对象,其属性为给定字母(字符串类型)的 letter,它们持久保存到 Core Data。

Alphabet.letter = "A"
Alphabet.letter = "M"
Alphabet.letter = "G"
Alphabet.letter = "T"
Alphabet.letter = "D"

我可以通过以下方式对它们进行排序:

let alphabetFetch = NSFetchRequest(entityName: "Alphabet")
let alphabetSort = NSSortDescriptor(key: "letter", ascending: true)

Alphabet.letter = "A"
Alphabet.letter = "D"
Alphabet.letter = "G"
Alphabet.letter = "M"
Alphabet.letter = "T"

现在我只想检索在“G”之后具有最接近的letter 值的 Alphabet 对象(在本例中,我想检索具有字母属性值“M”的 Alphabet 对象)。我将如何构造一个获取请求以最有效地获取此对象?

【问题讨论】:

【参考方案1】:

除了排序描述符,添加谓词和获取限制 对请求:

let request = NSFetchRequest(entityName: "Alphabet")
request.sortDescriptors = [ NSSortDescriptor(key: "letter", ascending: true) ]
request.predicate = NSPredicate(format: "letter > %@", "G")
request.fetchLimit = 1

获取请求返回一个包含单个元素的数组 是第一个匹配的对象(根据排序描述符),如果没有这样的元素,则为空数组 存在。

【讨论】:

我有一个附加问题;如果您想扩展此功能以始终返回循环中的下一个值(例如“T”的输入返回下一个对象“A”),您将如何扩展此请求? @Aaron:我不认为这可以通过单个提取请求来实现。 Core Data 获取请求中只有一组有限的比较方法可用。如果上述请求返回一个空数组,那么您必须发出另一个没有谓词的请求才能获得第一个值。【参考方案2】:

创建一个带有谓词的NSFetchRequest 以过滤项目>“G”并升序排序。

let letter = "G"
let letterRequest = NSFetchRequest(entityName:"Alphabet")
letterRequest.predicate = NSPredicate(format: "letter > %@", letter)
letterRequest.sortDescriptors = [NSSortDescriptor(key: "letter", ascending: true)]
letterRequest.fetchLimit = 1

【讨论】:

以上是关于NSFetchRequest 获取具有下一个最接近字符串属性的对象的主要内容,如果未能解决你的问题,请参考以下文章

获取当前邮政编码,并显示来自 NSArray 的最接近的结果

默认情况下,核心数据获取(NSFetchRequest)是不是以任何特定方式排序?

如何在一个 NSFetchRequest 中获取核心数据关系?

使用 NSFetchRequest 查找每个用户最反感的条目

具有不同记录和 UIPickerView 的 NSFetchRequest

核心数据中的 NSFetchRequest