2017-07-25 10 views
0

Swift 3とGRDB SQLiteライブラリを使用してiOSアプリケーションを開発しています。次のコードは、私の知る限りは、私が正しくドキュメントの例を、以下の午前言うことができるように「型の値 『[行]は』 『次』はメンバーを持っていない」GRDBとSwiftのrows.next()とのコンパイルエラー

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

のコンパイルエラーが発生します。 誰でも私が間違っていることを教えてもらえますか?

+1

fetchCursorは、次の()ではないfetchAllの提供します。 –

答えて

1

fetchAll方法は、あなたが他のすべての配列と同じように繰り返すことを、定期的スウィフト配列を返します。

let rows = try Row.fetchAll(db, sql, arguments:arguments) // [Row] 
for row in rows { 
    // use row 
} 

next方法は、あなたがfetchCursorメソッドで取得することを、カーソルに属します。 1つのステップですべてのデータベース結果をロードしないため、カーソルは配列ではありません。代わりに、カーソルが行の後の行を反復されています

let rows = try Row.fetchCursor(db, sql, arguments:arguments) // DatabaseCursor<Row> 
while let row = try rows.next() { 
    // use row 
} 

あなたが両方の配列とカーソルがデータベースの結果を反復処理できることがわかります。あなたはどちらを選ぶのですか?違いを見てください。

  • 配列にはデータベース値のコピーが含まれており、どのスレッドでも使用できます。
  • フェッチされた結果の数が多い場合、配列には多くのメモリが必要です。
  • 配列は何回も繰り返すことができます。
  • カーソルは、データベースの結果を怠惰に反復し、多くのメモリを消費しません。
  • カーソルはSQLiteにまっすぐに進み、必要な場合を除いてデータベース値をコピーしないため、カーソルが高速になります。
  • カーソルはどのスレッドでも使用できません。
  • カーソルは1回だけ反復できます。

は比較:

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

関連する問題