Swift中如何从Core Data中查询最新添加的10条数据
Core Data查询最新插入10条数据的解决方案
方案一:使用count计算offset(无需修改实体,推荐快速落地)
你之前认为无法提前获取总数量是误区:Core Data提供count(for:)接口可以仅查询匹配请求的总条数,不会加载任何实体数据,性能开销极低,完全可以用来计算offset。
修改后代码如下:
let managedContext = PersistenceService.managedObjectContext let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Clip") // 先查询总条数 let totalCount = try? managedContext.count(for: fetchRequest) if totalCount ?? 0 > 10 { fetchRequest.fetchOffset = totalCount! - 10 } fetchRequest.fetchLimit = 10 do { let clipItem = try managedContext.fetch(fetchRequest) mainClips = clipItem as! [Clip] } catch { let nserror = error as NSError NSLog("Unresolved error \(nserror), \(nserror.userInfo)") NSApplication.shared.presentError(nserror) }
这个方案拿到的结果就是存储中最后插入的最多10条数据,默认和插入顺序保持一致。
方案二:新增自增序列字段(严格匹配插入顺序,适合高精度要求场景)
如果要完全规避系统默认排序可能出现的异常,以及日期排序的精度问题,可以给Clip实体新增一个整数类型的insertSequence字段:
- 每次插入新的
Clip实例时,查询当前库中最大的insertSequence值,将新实例的insertSequence赋值为最大值+1(无数据时默认赋值为1) - 查询时按该字段倒序排序,设置fetchLimit为10即可拿到最新的10条数据,如果需要按插入正序展示,将结果数组反转即可
查询代码示例:
let managedContext = PersistenceService.managedObjectContext let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Clip") // 按插入序列倒序排列 fetchRequest.sortDescriptors = [NSSortDescriptor(key: "insertSequence", ascending: false)] fetchRequest.fetchLimit = 10 do { let clipItem = try managedContext.fetch(fetchRequest) mainClips = (clipItem as! [Clip]).reversed() // 反转后为插入正序 } catch { let nserror = error as NSError NSLog("Unresolved error \(nserror), \(nserror.userInfo)") NSApplication.shared.presentError(nserror) }
方案三:日期排序(适合对插入顺序精度要求不高的场景)
如果允许少量误差,也可以直接使用日期字段倒序排序,设置fetchLimit为10即可,比方案一性能更优,仅在同一时间批量插入多条数据时可能出现顺序偏差。
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

