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
fetchCursorは、次の()ではないfetchAllの提供します。 –