Swift之SQLite簡單封裝

昨天回顧了OC語言下使用并封裝SQLite,今天趁熱打鐵再試著用Swift實現一下對?SQLite的封裝,實現基本的連接數據庫、執行DDL(DML)、執行DQL功能。

//  SQLiteManager.swift

import UIKit

class SQLiteManager: NSObject {
    
    // MARK:- 設計單例對象
    // 1.創建類的實例變量
    // let是線程安全
    static let instance = SQLiteManager()
    
    // 2.對外提供獲取單例的接口
    // 定義類方法class func 方法名稱() -> 返回值
    class func shareInstance() -> SQLiteManager  {
        return instance
    }
    
    
    // MARK:- 對數據庫的操作
    
    // 定義數據庫的變量
    var db : OpaquePointer? = nil
    
    func openDB() -> Bool {
        // 1.獲取文件的路徑+文件名稱
        let filePath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first
        let file = (filePath! as NSString).appendingPathComponent("test.sqlite")
        let cFile = (file.cString(using: String.Encoding.utf8))!
        
        // print(filePath)
        
        // 2.打開數據庫
        if sqlite3_open(cFile, &db) != SQLITE_OK {
            print("打開數據庫失敗")
            return false
        }
        
        // 3.創建表
        return createTable()
    }
    
    func createTable() -> Bool {
        // 1.封裝創建表的SQL語句
        let createTableSQL = "CREATE TABLE IF NOT EXISTS 't_student' ( 'id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'name' TEXT,'age' INTEGER);";
        
        // 2.執行SQL語句
        return execSQL(createTableSQL)
    }
    
    func execSQL(_ sql : String) -> Bool {
        // 1.將sql語句轉成c語言字符串
        let cSQL = (sql.cString(using: String.Encoding.utf8))!
        
        return sqlite3_exec(db, cSQL, nil, nil, nil) == SQLITE_OK
    }
    
    
    func querySQL(_ querySQL : String) -> [[String : AnyObject]]? {
        // 定義游標對象
        var stmt : OpaquePointer? = nil
        
        // 將查詢語句轉成C語言的字符串
        let cQuerySQL = (querySQL.cString(using: String.Encoding.utf8))!
        
        // 查詢的準備工作
        if sqlite3_prepare_v2(db, cQuerySQL, -1, &stmt, nil) != SQLITE_OK {
            print("沒有準備好")
            return nil
        }
        
        // 準備好
        var tempArray = [[String : AnyObject]]()
        while sqlite3_step(stmt) == SQLITE_ROW {
            // 1.獲取列的個數
            let count = sqlite3_column_count(stmt)
            
            // 2.遍歷某一個列數據
            var dict = [String : AnyObject]();
            for i in 0..<count {
?                // 這里特別注意查到的key為C字符串,還需要轉成Swift下的字符串
                let cKey = UnsafePointer(sqlite3_column_name(stmt, i))
                // CString 轉 String
                let key = String.init(cString: cKey!)
                
                let cValue = UnsafePointer(sqlite3_column_text(stmt, i))
                let value = String.init(cString: cValue!)
                
                dict[key] = value as AnyObject?
            }
            
            // 3.將字典放入數組中
            tempArray.append(dict)
        }
        
        return tempArray
    }
}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,200評論 4 61
  • 轉載自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子閱讀 8,709評論 0 36
  • 前言和目錄 上一章 某年某月某日,天朗氣清,適逢周日,我與同事校哥相約一起去閑逛。 說是閑逛,并不是上街,而是從學...
    亦農閱讀 822評論 2 4
  • 進一同學朋友圈才知道,昨天是母校高三生拍畢業照的一天。復讀的同學說,一樣的照片,只是感覺不一樣了;有人說,第二次了...
    至此今夕閱讀 278評論 4 3