我正在使用Swift 3和GRDB SQLite库开发一个SQLite应用程序。以下代码片段将导致“类型为'Row‘的值没有成员'next'”的编译错误
let rows = try Row.fetchAll(db, sql, arguments:arguments)
while let row = try rows.next() { <--- line with error
...
}据我所知,我正在正确地遵循文档中的示例。有人能告诉我我做错了什么吗?
发布于 2017-07-26 09:21:36
fetchAll方法返回一个常规Swift数组,您可以像所有其他数组一样迭代该数组:
let rows = try Row.fetchAll(db, sql, arguments:arguments) // [Row]
for row in rows {
// use row
}next方法属于游标,由fetchCursor方法获得。游标不是数组,因为它们不是一次性加载所有数据库结果的。相反,游标是逐行迭代的:
let rows = try Row.fetchCursor(db, sql, arguments:arguments) // DatabaseCursor<Row>
while let row = try rows.next() {
// use row
}您可以看到,数组和游标都可以迭代数据库结果。你如何选择一个或另一个?看看不同之处:
比较:
// On the main thread:
let (rowArray, rowCursor) = try dbQueue.inDatabase { db -> ([Row], DatabaseCursor<Row>) in
let rowArray = try Row.fetchAll(db, "SELECT ...")
let rowCursor = try Row.fetchCursor(db, "SELECT ...")
// OK
for row in rowArray { ... }
while let row = try rowCursor.next() { ... }
// Second iteration
for row in rowArray { ... } // the same rows
while let row = try rowCursor.next() { ... } // no result
return (rowArray, rowCursor)
}
// OK: arrays can be consumed on any thread
for row in rowArray { ... }
DispatchQueue.global(.default).async {
for row in rowArray { ... }
}
// DON'T DO THAT, NEVER
while let row = try rowCursor.next() { ... }
DispatchQueue.global(.default).async {
while let row = try rowCursor.next() { ... }
}如果您没有看到,或者不关心差异,请使用数组。如果您关心内存和性能,则在适当时使用游标。
指向文档的链接:https://github.com/groue/GRDB.swift/blob/master/README.md#fetching-methods
https://stackoverflow.com/questions/45305095
复制相似问题