首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GRDB和Swift 3中用rows.next()编译错误

在GRDB和Swift 3中用rows.next()编译错误
EN

Stack Overflow用户
提问于 2017-07-25 13:39:58
回答 1查看 353关注 0票数 0

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

代码语言:javascript
复制
let rows = try Row.fetchAll(db, sql, arguments:arguments)
while let row = try rows.next() {             <--- line with error
      ...
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-26 09:21:36

fetchAll方法返回一个常规Swift数组,您可以像所有其他数组一样迭代该数组:

代码语言:javascript
复制
let rows = try Row.fetchAll(db, sql, arguments:arguments) // [Row]
for row in rows {
    // use row
}

next方法属于游标,由fetchCursor方法获得。游标不是数组,因为它们不是一次性加载所有数据库结果的。相反,游标是逐行迭代的:

代码语言:javascript
复制
let rows = try Row.fetchCursor(db, sql, arguments:arguments) // DatabaseCursor<Row>
while let row = try rows.next() {
    // use row
}

您可以看到,数组和游标都可以迭代数据库结果。你如何选择一个或另一个?看看不同之处:

  • 数组包含数据库值的副本,可以在任何线程上使用。
  • 如果获取的结果数量很高,数组可以占用大量的内存。
  • 数组可以多次迭代。
  • 游标对数据库进行迭代会导致延迟,并且不会占用太多内存。
  • 游标速度更快,因为它们直接进入SQLite,除非有必要,否则不会复制数据库值。
  • 游标不能在任何线程上使用。
  • 游标只能迭代一次。

比较:

代码语言:javascript
复制
// 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45305095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档