我想按日期和另一个描述符对fetchRequest进行排序:
df = df.apply(pd.to_numeric)
但是sortAmount不能使用,因为它按时间排序
let sortDate = NSSortDescriptor(key: "returnDate", ascending: true)
let sortAmount = NSSortDescriptor(key: "amount", ascending: true)
fetchRequest.sortDescriptors = [sortDate, sortAmount]
我怎样才能排序,例如,只按天?
答案 0 :(得分:0)
通常,您可以将NSSortDescriptor
子类化为自己的排序描述符,并在您自己的排序描述符中,比较没有时间组件的日期。然后使用您自己的排序描述符而不是标准描述符来比较日期。这里有一些未经测试的代码,但它会给你一个想法:
class DaySortDescriptor: NSSortDescriptor {
static private let calendar = NSCalendar( calendarIdentifier: .gregorian)
override
func compare ( _ object1: Any, to object2: Any ) -> ComparisonResult {
// Both must be dates as we cannot sort anything else
guard let date1 = object1 as? Date,
let date2 = object2 as? Date,
let calendar = DaySortDescriptor.calendar
else { assertionFailure(); return .orderedSame }
let comp1 = calendar.components(
[ .year, .month, .day ], from: date1
)
let comp2 = calendar.components(
[ .year, .month, .day ], from: date2
)
let cleanedDate1 = calendar.date(from: comp1)!
let cleanedDate2 = calendar.date(from: comp2)!
return super.compare(cleanedDate1, to: cleanedDate2)
}
}
唯一的问题是,虽然这将适用于刚存储在内存中的CoreData,以及使用二进制或XML作为后备存储的CoreData,但在使用SQLite后备存储时它将无法工作。实际上,Apple甚至对此发表了评论并提出了如何做的建议:
原因:获取请求的确切执行方式取决于商店 - 请参阅获取对象。
补救措施:如果直接执行fetch,请不要使用基于Cocoa的排序运算符 - 而是在内存中对返回的数组进行排序。 如果您使用的是数组控制器,则可能需要子类化 NSArrayController,因此它不会将排序描述符传递给 数据库,但将在您的数据之后进行排序 取出。