如何使用“选择*表,其中* =?”在Swift中使用Sqlite3

时间:2019-08-31 14:06:56

标签: sql swift sqlite where-clause

我正在为数据库使用SQLlite3,并且尝试使用“ select * table where * =?”在Swift中使用Sqlite3,但是我被卡在这里使用的方法的地方,但是我没有从方法中得到任何响应。

    func DoesExist(titles: String?){

        ArticleList.removeAll()
        let queryStrings = "SELECT * FROM articles WHERE title = ? "
        var stmt3:OpaquePointer?
        if sqlite3_prepare(db, queryStrings, -1, &stmt3, nil) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error preparing Select: \(errmsg)")
            return
        }
        if sqlite3_bind_text(stmt3, 1, titles, -1, nil) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure binding title: \(errmsg)")
            return
        }

        while(sqlite3_step(stmt3) == SQLITE_ROW){
            let id = sqlite3_column_int(stmt3, 0)
            let author = String(cString: sqlite3_column_text(stmt3, 1))
            let title = sqlite3_column_int(stmt3, 2)

            //adding values to list
            ArticleList.append(Article(id: Int(id), author: String(describing: author), title: String(describing: title)))
             print(ArticleList.count)
 }

    }

我不知道这是否有帮助,但是当我尝试打印sqlite3_step(stmt3)时,我得到了101 我没有弄错我做错了什么,所以如果有人熟悉此错误帮助,请吗?

***** UPDATE *****

我添加了

if sqlite3_step(stmt3) != SQLITE_DONE {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("failure inserting foo: \(errmsg)")
    }
    print("---------------------\(sqlite3_step(stmt3))")

而不是101,我得到21,这意味着:内存不足

1 个答案:

答案 0 :(得分:1)

(公认的误导性)“内存不足”错误是SQLite所说的db指针为nil的一种说法。在db调用之前打印/测试sqlite3_xxx,该错误使您出现“内存不足”错误,并且您会发现确实是nil。如果您确信以前打开过数据库,则必须具有将其重置为nil的执行路径,或者可能有多个db浮动引用(例如,一些本地var和ivar)。

您可以在方法的开始处添加此测试,该测试的开始precondition必须已经打开数据库:

precondition(db != nil, "Database not open")