Swift Core Data Fetch 按日期和时间存储为字符串并排序

Posted

技术标签:

【中文标题】Swift Core Data Fetch 按日期和时间存储为字符串并排序【英文标题】:Swift CoreDate Fetch by Date and Time Stored as String and Sort 【发布时间】:2017-08-18 09:41:52 【问题描述】:

在 CoreDate 表中,我将日期和时间存储为以下格式的字符串 我有一个特定的原因存储为字符串。

static let DateFmtVal = "dd-MM-yyyy";
static let TimeFmtVal = "hh:mm a";

现在在获取时我想通过将字符串转换为日期和时间进行排序并排序以显示在 TableView 中,因此具有较新行的行位于顶部

let DateSortVar = NSSortDescriptor(key: DateCol, ascending: false)
let TimeSortVar = NSSortDescriptor(key: TimeCol, ascending: false)
fetchedResultsController.fetchRequest.sortDescriptors = [DateSortVar, TimeSortVar]

android 中,使用 SQLite 我得到了解决方案:

SqlQryVar = "SELECT * FROM " + NamTblVal +
                        " ORDER BY STRFTIME('%d-%m-%Y %h:%i'," + DateCol + "|| ' ' ||" + TimeCol + ") DESC;";

请帮我在 Swift 中做同样的事情

【问题讨论】:

你不能。 Core Data 排序描述符只能使用固定的比较器列表,不能使用自定义代码。您必须获取数据,然后在内存中对其进行排序。 【参考方案1】:

您可以将 Date 类型的计算属性添加到您的 CoreData 对象(在您的子类中),在那里进行转换并将其仅传递给排序描述符,您将获得与 Android 应用程序中相同的行为,但要考虑考虑到 ios 与 Android 的不同之处在于,在 iOS 中将 String 转换为 Date 很慢!!!并且分配多个 DateFormatter 是昂贵的(但您可以使用一个进行所有转换)。因此,如果您没有很多日期,那么它可能对您有用,无论如何,如果您想获得正确的排序数据,那么您将不得不在某个时候进行转换。 另一种不转换为日期的解决方案是考虑对日期列使用其他格式,即“yyyy-mm-dd”,然后字符串排序将匹配日期。

【讨论】:

感谢您的提示。以“yyyy-mm-dd”格式存储字符串,对日期进行排序和匹配。这个技巧对我帮助很大。

以上是关于Swift Core Data Fetch 按日期和时间存储为字符串并排序的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期类型保存到 Swift Core Data 中实体的属性?

Swift Core Data 两个排序描述符

使用 NSSortDescriptor、Core Data 和 NSFetchedResultsController 按日期和名称对 UITableView 进行排序

IOS Swift Core Data如何在propertiesToFetch中添加不在propertiesToGroupBy中的字段

(Swift) 如何对 Core Data 进行模糊搜索?

在 Swift Core Data 中保存没有关系的实体