ios - SQLite DB - 执行结果是什么意思?

标签 ios swift sqlite

我正在使用 sqlite 编写我的应用程序,当我将数据插入表中时 (t_deleteMsgs)

enter image description here

initData()中:

db = SQLiteDB.sharedInstance

let result = db.execute(sql: "create table if not exists t_deleteMsg(uid integer primary key, msg_userId varchar(20), msg_id varchar(20))")  // if not exists
print(result)  

注意:

结果打印1,表示成功:

这是执行方法:

// Execute SQL with parameters and return result code
func execute(sql:String, parameters:[Any]?=nil)->CInt {
    var result:CInt = 0
    queue.sync() {
        if let stmt = self.prepare(sql:sql, params:parameters) {
            result = self.execute(stmt:stmt, sql:sql)
        }
    }
    return result
}

self.execute:

private func execute(stmt:OpaquePointer, sql:String)->CInt {
    // Step
    var result = sqlite3_step(stmt)
    if result != SQLITE_OK && result != SQLITE_DONE {
        sqlite3_finalize(stmt)
        if let error = String(validatingUTF8:sqlite3_errmsg(self.db)) {
            let msg = "SQLiteDB - failed to execute SQL: \(sql), Error: \(error)"
            NSLog(msg)
        }
        return 0
    }
    // Is this an insert
    let upp = sql.uppercased()
    if upp.hasPrefix("INSERT ") {
        // Known limitations: http://www.sqlite.org/c3ref/last_insert_rowid.html
        let rid = sqlite3_last_insert_rowid(self.db)
        result = CInt(rid)
    } else if upp.hasPrefix("DELETE") || upp.hasPrefix("UPDATE") {
        var cnt = sqlite3_changes(self.db)
        if cnt == 0 {
            cnt += 1
        }
        result = CInt(cnt)
    } else {
        result = 1
    }
    // Finalize
    sqlite3_finalize(stmt)
    return result
}

然后进入我的 vc 并创建表,然后将数据插入表中:

func saveDeleteMsgToDB(userId:String , deleteId:String) {

    let sql = "insert into t_deleteMsgs(msg_userId, msg_id) values('\(userId)', '\(deleteId)')"

    print("sql:\(sql)")
    // 通过封装的方法执行sql
    let result = db.execute(sql: sql)
    print(result)
}

结果:打印结果:2。不知道2是什么意思,你看我前面贴的self.execute方法,如果是就表示插入成功?

所以,我弹出 vc,然后再次进入 vcvc 将调用 initDeleteArr() 再次:

 func initDeleteArr() {

    let userStatic:UserStaticSwift = UserStaticSwift.sharedInstance()

    let data = db.query(sql: "select * from t_deleteMsgs where msg_userId = \(userStatic.userId)")  // here the data's count is 0.
    if data.count > 0 {

        let delete_msg = data[data.count - 1]
        print(delete_msg)
    }
}

initDeleteArr()中:

SQLiteDB - failed to prepare SQL: select * from t_deleteMsgs where msg_userId = d92c1ea9541c477fbed9135c28bc4e12, Error: no such column: d92c1ea9541c477fbed9135c28bc4e12

那么问题出在哪里,是不是插入数据失败了?

最佳答案

您的 SQL 表达式无效:select * from t_deleteMsgs where msg_userId = d92c1ea9541c477fbed9135c28bc4e12 因为它将查找名为 d92c1ea9541c477fbed9135c28bc4e12 的列。使用 ' 转义此字符串,它应该可以工作:

select * from t_deleteMsgs where msg_userId = 'd92c1ea9541c477fbed9135c28bc4e12'

所以在你的代码中:

let data = db.query(sql: "select * from t_deleteMsgs where msg_userId = '\(userStatic.userId)'")

关于ios - SQLite DB - 执行结果是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41737023/

相关文章:

ios - UISegmentedControl 的 NSAttributedstring

iphone - ASIHTTPRequest和背景

ios - 如何在iOS 13上解决 “XPC connection interrupted”?

ios - ViewController 将 Swift 从一个 VC 推送到另一个 VC 并返回

ios - 如何异步下载和缓存视频以供在我的应用中使用?

ios - 使用 AVAssetExportSession 和 AVMutableComposition 制作 AVFileTypeMPEG4 视频文件

ios - 我应该使用 UIDocument 来处理已保存到磁盘的 PDF 文件吗?

python - 将日期转换为日期时间对象python

java - 如何分割 List<List<String>> 行

mysql - 比较两个表或查询和表