测试已测试 | ✗ |
语言语言 | 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 模式。
如果您使用 Cocoapods,则可以在 podfile 中添加以下内容
pod 'SQLFetchedResultsController'
# Or if you prefer:
# pod 'SQLFetchedResultsController', '~> X.X.X'
如果您不使用 Cocoapods,请执行以下操作
使用 Swift 吗?
将以下内容添加到您的桥接头文件中
#import "FMDB.h"
#import "SQLFRC.h"
初始化获取控制器
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联合滚动光标的优秀文章,尽管有些过时。它深入探讨了在大结果集中解析的注意事项和禁忌。