美文网首页
Swift之SQLite简单封装

Swift之SQLite简单封装

作者: kangyiii | 来源:发表于2018-02-25 00:07 被阅读0次

    昨天回顾了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
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Swift之SQLite简单封装

          本文链接:https://www.haomeiwen.com/subject/tthhxftx.html