Swift-SQLite

作者: Mg明明就是你 | 来源:发表于2016-04-17 16:35 被阅读405次

    SQLite函数总结

    1.打开数据库
    int sqlite3_open(
        const char *filename,   // 数据库的文件路径
        sqlite3 **ppDb          // 数据库实例
    );
    
    2.执行任何SQL语句
    int sqlite3_exec(
        sqlite3*,                                  // 一个打开的数据库实例
        const char *sql,                           // 需要执行的SQL语句
        int (*callback)(void*,int,char**,char**),  // SQL语句执行完毕后的回调
        void *,                                    // 回调函数的第1个参数
        char **errmsg                              // 错误信息
    );
    
    3.检查SQL语句的合法性(查询前的准备)
    int sqlite3_prepare_v2(
        sqlite3 *db,            // 数据库实例
        const char *zSql,       // 需要检查的SQL语句
        int nByte,              // SQL语句的最大字节长度
        sqlite3_stmt **ppStmt,  // sqlite3_stmt实例,用来获得数据库数据
        const char **pzTail
    );
    
    4.查询一行数据
    int sqlite3_step(sqlite3_stmt*); // 如果查询到一行数据,就会返回SQLITE_ROW
    
    5.利用stmt获得某一字段的值(字段的下标从0开始)
    double sqlite3_column_double(sqlite3_stmt*, int iCol);  // 浮点数据
    int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据
    sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据
    const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二进制文本数据
    const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);  // 字符串数据
    

    • 如何封装工具类,来做数据库操作,总结如下步骤
      • 0.封装⼯工具类,来做数据库操作设计成单例
      • 1.打开或者创建数据库sqlite3_open
      • 2.创建表sqlite3_exec
      • 3.添加/修改/删除sqlite3_exec
      • 4.查询数据sqlite3_prepare_v2

    附上代码:

    存储对象Person类

    import UIKit
    
    class Person: NSObject {
        var age : Int = 0
        var name : String?
        
        init(dict : [String : AnyObject]) {
            super.init()
            
            setValuesForKeysWithDictionary(dict)
        }
        
        // MARK:- 和数据库之间的操作
        func insertPerson() {
            // 1.获取插入的SQL语句
            let tempName = name == nil ? "" : name!
            let insertSQL = "INSERT INTO t_person (name, age) VALUES ('\(tempName)', \(age))"
            
            // 2.执行SQL语句
            if SQLiteManager.shareIntance.execSQL(insertSQL) {
                print("插入成功")
            }
        }
    }
    

    工具类

    import UIKit
    
    class SQLiteManager: NSObject {
        // let修饰常量是线程安全
        static let shareIntance : SQLiteManager = SQLiteManager()
        
        /// 数据库句柄
        var db : COpaquePointer = nil
        
    
     override init() {
            super.init()
            openDB("demo.sqlite")
        }
    
        /// 提供一个函数,让别人可以打开一个数据库
        func openDB(dbName : String) {
            // 1.获取数据库文件存放的路径
            guard var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first else {
                print("没有获取到路径")
                return
            }
            path = (path as NSString).stringByAppendingPathComponent(dbName)
            print(path)
            
            // 2.打开数据库:如果有数据库则打开,如果没有则创建
            // 参数三:数据库句柄(类似于游戏手柄).
            // COpaquePointer : Swift中是没有指针,但是在Swift和OC/C开发过程中使用指针再所难免
            SQLITE_OK
            if sqlite3_open(path, &db) != SQLITE_OK {
                print("打开或者创建数据库失败")
                return
            }
            
            // 3.创建表
            createTable()
        }
        
        
        /// 创建一张表
        func createTable() {
            // 1.获取创建表的SQL语句
            let createTableSQL = "CREATE TABLE IF NOT EXISTS t_person ( \n" +
                "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \n" +
                "name TEXT, \n" +
                "age INTEGER\n" +
                ");"
            
            // 2.执行SQL语句
            if execSQL(createTableSQL) {
                print("创建表成功")
            }
        }
        
        /// 执行SQL语句(创建表/添加/删除/修改)
        func execSQL(sqlString : String) -> Bool {
            // 1.参数一:数据库句柄
            // 2.参数二:sql语句
            // 3.参数三:执行完语句会回调的闭包,一般传nil即可
            // 4.参数四:和参数三相关的一个参数.一般传nil科技
            // 5.参数五:错误信息.
            return sqlite3_exec(db, sqlString, nil, nil, nil) == SQLITE_OK
        }
        
        
        /// 执行查询操作(将查询到的结果返回到一个字典数组中)
        func querySQL(querySQL : String) -> [[String : AnyObject]]? {
            
            // 1.定义游标指针
            var stmt : COpaquePointer = nil
            
            // 2.查询的准备工作(给stmt赋值)
            // 1.参数一:数据库句柄
            // 2.参数二:查询语句
            // 3.参数三:查询语句的长度. -1是自动计算
            // 4.参数四:数据库`游标`对象
            if sqlite3_prepare_v2(db, querySQL, -1, &stmt, nil) != SQLITE_OK {
                print("没有准备好查询")
                return nil
            }
            
            // 3.查看是否有下一条语句
            var dictArray = [[String : AnyObject]]()
            while sqlite3_step(stmt) == SQLITE_ROW {
                // 有下一条语句,则将该语句转成字典,放入数组中
                dictArray.append(getRecord(stmt))
            }
            
            return dictArray
        }
        
        /// 根据'游标指针'获取一条数据
        func getRecord(stmt : COpaquePointer) -> [String : AnyObject] {
            // 1.获取字段个数
            let count = sqlite3_column_count(stmt)
            var dict = [String : AnyObject]()
            for i in 0..<count {
                // 2.取出字典对应的key
                let cKey = sqlite3_column_name(stmt, i)
                guard let key = String(CString: cKey, encoding: NSUTF8StringEncoding) else {
                    continue
                }
                
                // 3.取出字典对应的value
                let cValue = UnsafePointer<Int8>(sqlite3_column_text(stmt, i))
                guard let value = String(CString: cValue, encoding: NSUTF8StringEncoding) else {
                    continue
                }
                
                // 4.将键值放入字典中
                dict[key] = value
            }
            
            return dict
        }
    }
    

    在控制器

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
        
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            loadPersonData()
        }
        
        /// 加载所有的数据
        func loadPersonData() {
            // 1.获取查询语句
            let querySQL = "SELECT name, age FROM t_person;"
            
            // 2.执行查询语句
            guard let array = SQLiteManager.shareIntance.querySQL(querySQL) else {
                return
            }
            
            // 3.遍历数组
            var persons : [Person] = [Person]()
            for dict in array {
                let p = Person(dict: dict)
                persons.append(p)
            }
        }
        
        // MARK:- 对数据库的操作:添加/修改/删除
        func deleteData() {
            // 1.获取删除的SQL语句
            let deleteSQL = "DELETE FROM t_person WHERE id = 1;"
            
            // 2.执行SQL语句
            if SQLiteManager.shareIntance.execSQL(deleteSQL) {
                print("删除成功")
            }
        }
        
        func updateData() {
            // 1.获取修改的SQL语句
            let updateSQL = "UPDATE t_person SET name = 'lmj' WHERE id = 1;"
            
            // 2.执行SQL语句
            if SQLiteManager.shareIntance.execSQL(updateSQL) {
                print("修改成功")
            }
        }
        
        func insertData(name : String, age : Int) {
            // 1.创建person对象
            let p = Person(dict: ["name" : name, "age" : age])
            
            // 2.将自己插入到数据库中
            p.insertPerson()
        }
    }
    

    相关文章

      网友评论

      • i_iOS:在swift3里面 UnsafePointer<Int8>(sqlite3_column_text(stmt, i))报错应该怎么修改呢
        Mg明明就是你:@尼玛什么昵称都有人用 还没用3.0不好意思,你把这个函数百度一下,会有3.0的写法的:smile:
      • 墨迹momo:...那么什么时候打开数据库啊 func openDB(dbName : String)都没用到啊
        Mg明明就是你:@墨迹momo
        override init() {
        super.init()
        openDB("demo.sqlite")
        }
        这里,忘记写上去了,谢谢你的提醒,已经加上去了

      本文标题:Swift-SQLite

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