ios开发TimePie第4天-数据入Sqlite库

一个程序最有价值的就是数据了,todo是一个高度结构化的数据放到sqlite是最合适不过的了,以后往android上移植也很方便,搜索了几个包装Sqlite的库都比较恐怖比如Sqlite.swift,介于这个应用的数据逻辑很简单就自己封装了一下sqlite的操作,这里又一个小trick就是选择不同的todo切换。

引用依赖库

在项目 General/Linked Frameworks and Libraries/+ 添加libSqlite3.tbd

如果想让sqlite3库随版本更新可以考虑使用libsqlite3.0.tbd

常用的操作

  • 注释: Command + /

封装插入方法

二进制数据你去bind我还能理解,感觉sqlite没那么麻烦int和string竟然还需要bind,应该能修改的第一个版本先这样吧。

    func insert(item:TodoItem, start:Int, span:Int){
        var stmt: OpaquePointer?
        
        let queryString = "INSERT INTO Done (code, name, start,end,span) VALUES (?,?,?,strftime('%s','now'),?)"
        
        if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error preparing insert: \(errmsg)")
            return
        }
        
        if sqlite3_bind_int(stmt, 1, Int32(item.code)) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure binding code: \(errmsg)")
            return
        }
        
        if sqlite3_bind_text(stmt, 2, item.name, -1, nil) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure binding name: \(errmsg)")
            return
        }
        if sqlite3_bind_int(stmt, 3, Int32(start)) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure binding start: \(errmsg)")
            return
        }
        
        if sqlite3_bind_int(stmt, 4, Int32(span)) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure binding span: \(errmsg)")
            return
        }
        
        if sqlite3_step(stmt) != SQLITE_DONE {
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure inserting todo: \(errmsg)")
            return
        }
        print("itme saved successfully")
    }

view code:【sqliteutil.swift

Leave a Comment