SQLFetchedResultsController 0.0.4

SQLFetchedResultsController 0.0.4

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2015年7月

Daniel Jackson维护。



这是一次尝试,旨在使使用 SQLite 设置表格变得更加容易。关于如何在数据库中正确分页结果的示例并不多。我想解决这个问题。对于那些喜欢 SQL 提供的灵活性,但又不想放弃用 Core Data 的 NSFetchedResultsController 设置表格所获得的便利性的人来说,这个类就适合你们。

警告 此脚本仍在开发中。它可能不会总是正确显示列表。请在我弄清楚这些问题时耐心等待。如果您想帮助我解决以下 Todo 话题中的一些,请尽您所能。

它如何工作?

该类尝试使用 where 子句和第一个排序描述符逐步加载对象。基本上,如果您在表中按升序排序,where 子句将使用 sortKey >= sortValue 来分页下一批结果,如果您在表中按降序排序,where 子句将使用 sortKey <= sortValue 来分页下一批结果。这个问题在于重复项。为了解决这个问题,我们使用 OFFSET 值。因为 OFFSET 本身较慢,所以最好使用没有太多重复项的 sortKey。

此类还使用表的键来帮助区分具有重复排序值中的一组元组。主键是从指定的第一个表推导出来的。该主键将始终包含在结果对象中。

当该类检测到表中出现较大跳跃时,它将设置 OFFSET 为最近的已知值。

想看到它的实际效果吗?下载示例,并随意在 SQLFetchedResultsController 中启用 DEBUG 模式。

依赖

  • FMDB
  • Sqlite3

安装

如果您使用 Cocoapods,则可以在 podfile 中添加以下内容

pod 'SQLFetchedResultsController'

# Or if you prefer:
# pod 'SQLFetchedResultsController', '~> X.X.X'

如果您不使用 Cocoapods,请执行以下操作

  1. 将 Src/ 中的文件添加到您的项目中
  2. 从: https://github.com/ccgus/fmdb 获取最新的 FMDB 版本
  3. 在您的应用设置中添加 Sqlite3 库

使用 Swift 吗?

将以下内容添加到您的桥接头文件中

#import "FMDB.h"
#import "SQLFRC.h"

待办事项

  • 修复有关确保所有数据在有短表格和长表格中显示的bug
  • 修复有关 group by 和 having 检索参数的bug
  • 添加部分支持
  • 添加部分索引标题支持
  • 添加基于主键值跳转到任意位置的方法。这应该可以提高跳转到任意位置的性能。
  • 在NSFetchedResultsController和SQLFetchedResultsController之间运行速度比较

如何使用

初始化获取控制器

    override func viewDidLoad() {
        super.viewDidLoad()

    var request = SQLFetchRequest()
    request.table = "(SELECT id, title FROM Test)" // Do not use > 1 table or sql expression
    //        request.table = "Test"
    request.fields = ["id","title"]
    request.predicate = "id % 100 = 0"
    request.sortDescriptors = [SQLSortDescriptor(key: "cast(id as text)", ascending: true)] //Sort the id like text.
    //        request.sortDescriptors = [SQLSortDescriptor(key: "title", ascending: true)]
    //        request.groupBy = "title"
    //        request.having = "count(*) > 3"
    fetchController = SQLFetchedResultsController(request: request, pathToDatabase: DatabaseSetup.getDatabasePath(), uniqueKey:"id", sectionKey: "id")

        fetchController?.previewSQL()
    }

然后只需设置表格

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "standard")

        var result = fetchController?.objectAt(indexPath)
        var id:AnyObject! = result?["id"]
        var title:AnyObject! = result?["title"]
        var idAvg:AnyObject! = result?["idAvg"]

        cell.textLabel?.text = "\(id). \(title)"

        return cell
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return fetchController?.numberOfRows ?? 0
    }

线程安全

在确保完全线程安全方面尚未投入太多工作。就数据库而言,FMDB声称"为每个线程创建一个FMDatabase对象一直是OK的。"这正是我所做的。我按需实例化一个FMDatabase,然后立即关闭它。

参考资料

这是一篇关于使用SQLite联合滚动光标的优秀文章,尽管有些过时。它深入探讨了在大结果集中解析的注意事项和禁忌。

http://www.sqlite.org/cvstrac/wiki?p=ScrollingCursor