在iOS10中使用SQLite3記錄


準(zhǔn)備步驟

  1. 在項目界面,進(jìn)入Build Phases面板,選擇Link Binary With Libraries --> + --> Add Other... -->Command+Shift+g -->輸入/usr/lib --> 選擇libsqlite3.dylib
  2. 添加一個頭文件xxx.h到創(chuàng)建的項目中,打開此文件,輸入 #import "sqlite3.h"
  3. 在項目界面,進(jìn)入Build Setting選項,找到Objective-C Bridging Header,將其設(shè)置為添加的頭文件xxx.h

示例demo

    var db:OpaquePointer? = nil
    @IBOutlet weak var name: UITextField!
    @IBOutlet weak var address: UITextField!
    @IBOutlet weak var age: UITextField!
Paste_Image.png

創(chuàng)建數(shù)據(jù)庫

    @IBAction func createdatabse(_ sender: AnyObject) {
        
        let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let docsDir = dirPaths[0] as NSString
        let databasePath = NSString(string:docsDir.appendingPathComponent("Match.db"))
        
        //判斷數(shù)據(jù)庫是否打開
        if (sqlite3_open(databasePath.utf8String, &db) != SQLITE_OK){
            print("數(shù)據(jù)庫打開失敗")
        }
        print("數(shù)據(jù)庫路徑是:'\(databasePath as String)'")
        sqlite3_close(db)
        
    }
  1. 使用sqlite3_open函數(shù)打開數(shù)據(jù)庫
  1. 使用sqlite3_exec函數(shù)執(zhí)行語句
  2. 使用sqlite3_close函數(shù)釋放資源

創(chuàng)建表

    func execSql(_ sql:NSString) {
        if sqlite3_exec(db, sql.utf8String, nil, nil, nil) != SQLITE_OK {
            let errmsg = String(cString:sqlite3_errmsg(db))
            print("error creating table :\(errmsg)")
        }
    }

  @IBAction func createtable(_ sender: AnyObject) {
        
        let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let docsDir = dirPaths[0] as NSString
        let databasePath = NSString(string:docsDir.appendingPathComponent("Match.db"))
        
        //判斷數(shù)據(jù)庫是否打開
        if (sqlite3_open(databasePath.utf8String, &db) != SQLITE_OK){
            print("數(shù)據(jù)庫打開失敗")
        } else {
            let sqlCreateTable:NSString = NSString(string:"CREATE TABLE IF NOT EXISTS match (name TEXT, address TEXT , age INTEGER)")
            execSql(sqlCreateTable)
            print("創(chuàng)建數(shù)據(jù)庫成功")
        }
        sqlite3_close(db)
    }

插入數(shù)據(jù)


    @IBAction func insertData(_ sender: AnyObject) {
        let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let docsDir = dirPaths[0] as NSString
        let databasePath = NSString(string:docsDir.appendingPathComponent("Match.db"))
        
        if (sqlite3_open(databasePath.utf8String, &db) != SQLITE_OK){
            print("數(shù)據(jù)庫打開失敗")
        } else {
            
            let namef = name.text!
            let addressf = address.text!
            let agef = Int(age.text!)!
            
            let sql :NSString = NSString(string: "INSERT  INTO match VALUES ('\(namef)','\(addressf)','\(agef)')")           
            self.execSql(sql)          
            print("插入數(shù)據(jù)成功")
            
        }
        sqlite3_close(db)
    }


查詢數(shù)據(jù)

@IBAction func search(_ sender: AnyObject) {
        
        let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let docsDir = dirPaths[0] as NSString
        let databasePath = NSString(string:docsDir.appendingPathComponent("Match.db"))
        
        var canshu = 33        //查詢條件里的整型變量,在本示例暫時固定
        var canshustr = "ttt" //查詢條件里的字符串變量,在本示例暫時固定
        var statement:OpaquePointer? = nil

        if (sqlite3_open(databasePath.utf8String, &db) != SQLITE_OK){
            print("數(shù)據(jù)庫打開失敗")
        } else { 
            print("數(shù)據(jù)庫打開成功")   
            let sql = "SELECT * FROM match where name = ? and age = ?"
            //let sql = "SELECT * FROM match where age = ?" //單個條件
            //let sql = "SELECT * FROM match" //無查詢條件
            let cSql = sql.cString(using: String.Encoding.utf8) //轉(zhuǎn)換為C接受的char*類型
            
            //預(yù)處理過程
            if sqlite3_prepare_v2(db, cSql!, -1, &statement, nil) == SQLITE_OK {               
                print("進(jìn)入預(yù)處理過程")         
                //綁定參數(shù)開始
                sqlite3_bind_text(statement,1,canshustr,-1,nil) //字符串參數(shù)
                sqlite3_bind_int(statement,2,Int32(canshu)) //整型參數(shù)
                
                var strname = "a" //簡單初始化
                var straddress = "b"
                var strage = 54
                
                //執(zhí)行查詢
                while (sqlite3_step(statement) == SQLITE_ROW) {                 
                    print("開始查詢")

                    //提取字段數(shù)據(jù)
                    if let bufzhudui = UnsafeRawPointer.init(sqlite3_column_text(statement, 0)) {
                        let uptr1 = bufzhudui.bindMemory(to:CChar.self, capacity:0)
                        strname = String(validatingUTF8:uptr1)!
                    }
                    
                    if let bufdate = UnsafeRawPointer.init(sqlite3_column_text(statement, 1)) {
                        let uptr2 = bufdate.bindMemory(to:CChar.self, capacity:0)
                        straddress = String(validatingUTF8:uptr2)!
                    }

                    strage = Int(sqlite3_column_int(statement,2))

                    print("name:'\(strname)'")
                    print("address is :'\(straddress)")
                    print("age is : " + String(strage) )               
                    
                }
                print("查詢結(jié)束")
                
                sqlite3_finalize(statement)  //釋放語句對象

            }            
            
        }
        sqlite3_close(db) //關(guān)閉數(shù)據(jù)庫
      
    }
  1. 使用sqlite3_open函數(shù)打開數(shù)據(jù)庫
  1. sqlite3_prepare_v2預(yù)處理sql語句 (將sql編譯成二進(jìn)制代碼,提高sql語句的執(zhí)行速度.)
  2. sqlite3_bind_text綁定參數(shù)(前提:有查詢條件)
  3. sqlite3_step 執(zhí)行sql語句,遍歷結(jié)果集
  4. sqlite3_column_text 提取字段數(shù)據(jù)
  5. sqlite3_finalize和sqlite3_close釋放資源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尔崔,一起剝皮案震驚了整個濱河市星虹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌地回,老刑警劉巖沛膳,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扔枫,死亡現(xiàn)場離奇詭異,居然都是意外死亡锹安,警方通過查閱死者的電腦和手機短荐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叹哭,“玉大人忍宋,你說我怎么就攤上這事』八伲” “怎么了讶踪?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泊交。 經(jīng)常有香客問我乳讥,道長,這世上最難降的妖魔是什么廓俭? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任云石,我火速辦了婚禮,結(jié)果婚禮上研乒,老公的妹妹穿的比我還像新娘汹忠。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布宽菜。 她就那樣靜靜地躺著谣膳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铅乡。 梳的紋絲不亂的頭發(fā)上继谚,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音阵幸,去河邊找鬼花履。 笑死,一個胖子當(dāng)著我的面吹牛挚赊,可吹牛的內(nèi)容都是我干的诡壁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼荠割,長吁一口氣:“原來是場噩夢啊……” “哼妹卿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蔑鹦,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤纽帖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后举反,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡扒吁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年火鼻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雕崩。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡魁索,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盼铁,到底是詐尸還是另有隱情粗蔚,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布饶火,位于F島的核電站鹏控,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肤寝。R本人自食惡果不足惜当辐,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鲤看。 院中可真熱鬧缘揪,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袖裕,卻和暖如春曹抬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陆赋。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工沐祷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攒岛。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓赖临,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灾锯。 傳聞我的和親對象是個殘疾皇子兢榨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容