【问题标题】:compile error with rows.next() in GRDB and Swift 3在 GRDB 和 Swift 3 中使用 rows.next() 编译错误
【发布时间】:2017-07-25 13:39:58
【问题描述】:

我正在使用 Swift 3 和 GRDB SQLite 库开发一个 iOS 应用程序。以下代码片段导致“类型'[Row]'的值没有成员'next'”的编译错误

let rows = try Row.fetchAll(db, sql, arguments:arguments)
while let row = try rows.next() {             <--- line with error
      ...
}

据我所知,我正确地遵循了文档中的示例。 谁能告诉我我做错了什么?

【问题讨论】:

  • fetchCursor 给出 next() 而不是 fetchAll。

标签: ios swift grdb


【解决方案1】:

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
}

您看到数组和游标都可以迭代数据库结果。你如何选择其中之一?看看区别:

  • 数组包含数据库值的副本,可以在任何线程上使用。
  • 如果获取的结果数量很多,数组可能会占用大量内存。
  • 数组可以迭代多次。
  • 游标以惰性方式迭代数据库结果,并且不会消耗太多内存。
  • 游标速度更快,因为它们直接转到 SQLite,除非必要,否则不会复制数据库值。
  • 游标不能用于任何线程。
  • 游标只能迭代一次。

比较:

// 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

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2017-01-15
    相关资源
    最近更新 更多