2017-01-26 22 views
1

、私のコードです:GRDB.swift要求[完了]

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    do 
    { 
     let dbQueue = try DatabaseQueue(path: "games.sqlite") 

     try dbQueue.inDatabase 
     { 
      db in try db.execute("SELECT * FROM games") 
     } 
    } 
    catch 
    { 
     print("Erreur !") 
    } 
} 

私は見つけられません。ドキュメントではシンプルな選択を行うための簡単な方法を教えてくれます。私はすぐに直接クエリを行うことを望んでいます。 マニュアルは、モデルの一部のエラーについてのみ説明しています。

ありがとうございました。

私の環境: Xcode8.2.1 swift3 cocoapods 1.2.0.rc.1

答えて

1

GRDBドキュメントsays

データベース接続を許可されたら、execute方法はSQLを実行CREATE TABLE、INSERT、DELETE、ALTERなどのデータベース行を返さない文。

行をフェッチしたい場合は、間違った方法を選択しました。

ローをフェッチするには、Row Queriesドキュメントの章に記載されているフェッチ方法(fetchで始まる)を使用することをお勧めします。例えば

let rows = try dbQueue.inDatabase { db in 
    try Row.fetchAll(db, "SELECT * FROM games") 
} 
// Now we're back to the main thread: use rows: 
for row in rows { 
    let name: String = row.value(named: "name") 
    let year: Int = row.value(named: "year") 
    print(name) 
    print(year) 
} 

それは "モデルを経由せず" を与えるものです。しかし

モデルはまだ便利です:あなたはゲームの種類(構造体やクラス)がRowConvertibleプロトコルを採用してい

let games = try dbQueue.inDatabase { db -> [Game] in 
    let rows = try Row.fetchAll(db, "SELECT * FROM games") 
    return rows.map { row in 
     Game(
      name: row.value(named: "name"), 
      year: row.value(named: "year")) 
    } 
} 
// Now we're back to the main thread: use games 
for game in games { 
    print(game.name) 
    print(game.year) 
} 

場合、あなたも書き込むことができます。

let games = try dbQueue.inDatabase { db in 
    try Game.fetchAll(db, "SELECT * FROM games") 
} 

そして、ゲームにも採用している場合TableMappingプロトコルでは、

ドキュメントについては、Recordを参照してください。それらのプロトコルの

+0

こんにちは、 私は説明に時間をとっていただき、ありがとうございます。 実際、データベースに接続する際に問題が発生しました(これは自動化のためのクラスではありません:相対パスまたは絶対パス)。正しい方法はありませんでした。 あなたの説明は、私の全時間がフレームワークを理解するのに大いに役立った。 もう一度ありがとうございます。 – yave

関連する問題