2016-12-11 10 views
0

私は、SQLite.swiftを使用して、iOS10アプリケーションのデータベースに接続しています。.prepareと.selectの比較

IHE_IDが別のView Controllerから渡された特定の大学の詳細を選択したいとします。

私は、その特定の大学の行を選択したいだけですが、質問することはできません。しかし、準備をしてすべてのデータをループしてから、必要なものを選択することができます。送信用のビューコントローラからIHE Intとして渡された特定のIHE_IDを持っているので、必要以上にリソースを消費します。

接続が

do { 
         let db = try Connection(destinationDBPath, readonly: true) 
         let IHEs = Table("IHE") 
         let IHE_ID = Expression<Int>("IHE_ID") 
         let IHE_Name = Expression<String>("IHE_Name") 
         let IHE_COE_Url = Expression<String>("IHE_COE_URL") 
         let IHE_Sector = Expression<Int>("IHE_Sector") 
         let IHE_COE_Name = Expression<String>("IHE_COE_Name") 
     for ihe in try db.prepare(IHEs){ 
         if (ihe[IHE_ID] == anIHE){ 

          // build this string, otherwise ignore rest of dataset (doing this because query isn't working) 

          buildIHE = "Name: \(ihe[IHE_Name])\n" 
          buildIHE.append("URL: \(ihe[IHE_COE_Url])\n") 
          // buildIHE.append("Sector: \(ihe[IHE_Sector])\n") 

          if (ihe[IHE_Sector] == 0) { 
           buildIHE.append("Sector: Public\n") 
          } else { 
           buildIHE.append("Sector: Private\n") 
          } 
          buildIHE.append("College of Education Name: \(ihe[IHE_COE_Name])\n") 

         } 

        } 
        print ("Got through building IHE portion of view") 

は、私は何をしたいのは、forループの代わりにこれを使用している...そのコードを省略ので働いています。

最後に、クエリが機能するようになったら、選択した要素を使用します。 私はおそらく、クエリ上で私の構文に何か間違っていると思うが、どんな助けにも感謝しています。

Xcodeで "if let query"の行にこのエラーがあります。 条件付きバインドの初期化子には、 'Table'ではなくOptional型が必要です。 これは、私が.selectステートメントを使用して、SQLite.swiftとswiftを一般的に使用したことで何かと思うようになります。

最後に、このコードに示すように、anIEがIntとしてこの関数に入り、IHE_IDがExpressionです。私はこれが問題の一部であるかもしれないと思っています。

答えて

0

Initializer for conditional binding must have Optional typeエラーがif let v = expr文の右側の式がオプションではないことを意味しますが許可すれば使用しない点はありません、そしてスウィフトコンパイラはあなただけlet v = exprを書くべきであると述べています。

実際、IHEs.select(...).filter(...)は、タイプがTableの任意の値ではない値を返します。

クエリは定義されているが、はまだを実行していないので、それは、あなたが期待するデータベース行ではありません。結局、あなたはdbを使っていませんでした。

解決方法は、データベース接続を戻し、1行を読み込むことです。これはpluckメソッドで行われます。

if let ihe = try db.pluck(IHEs.select(...).filter(...)) { 
    print("Name \(ihe[IHE_Name])") 
} 
+0

ありがとうございます!私は今日これを試し、.pluck()を読んでください –

+0

あなたは大歓迎です。しかし、SQLite.swiftよりも実験的ではない他のSQLiteライブラリがあります(https://github.com/groue/GRDB.swiftなど)。 –

関連する問題