3

SQLite.swift を使用して FTS テーブルをクエリしようとしています。以前は Android でやっていました。私がやろうとしていることの本質はこれです:

SELECT *
FROM t2
WHERE id IN (SELECT docid
             FROM fts_table
             WHERE col_text MATCH 'something')

SQLite.swiftのドキュメントから、IN条件は次のように記述できることがわかります

users.filter([1, 2, 3, 4, 5].contains(id))
// SELECT * FROM "users" WHERE ("id" IN (1, 2, 3, 4, 5))

そして、仮想テーブルは次のようにクエリできます:

let wonderfulEmails = emails.match("wonder*")
// SELECT * FROM "emails" WHERE "emails" MATCH 'wonder*'

let replies = emails.filter(subject.match("Re:*"))
// SELECT * FROM "emails" WHERE "subject" MATCH 'Re:*'

しかし、これらを組み合わせる方法がわかりません。任意の SQLを実行する必要はありません(ただし、この回答のおかげで現在は機能しています)。

アップデート

これが機能していない私の最近の試みです:

let tableText = Table("t2")
let id = Expression<Int64>("id")
let someColumn = Expression<String>("someColumn")

let tableFts = VirtualTable("fts_table")
let columnDocId = Expression<Int64>("docId")


let ftsQuery = tableFts
    .select(columnDocId)
    .filter(tableFts.match("something"))
let tableQuery = tableText
    .filter((try db.prepare(ftsQuery))
        .contains(id))                       // <-- error

for row in try db.prepare(tableQuery) {
    print(row[someColumn])
}

次の行でcontains(id)エラーがスローされます。

タイプ 'Expression' の値を予期される引数タイプ '@noescape (Row) throws -> Bool' に変換できません

4

1 に答える 1