swift:sqlite3的使用

Posted 程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift:sqlite3的使用相关的知识,希望对你有一定的参考价值。

介绍

一、sqlite是纯C语言中底层的数据库,在OC和Swift中都是经常使用的数据库,在开发中,可以使用代码创建数据库,可以使用图形化界面创建数据库。例如SQLiteManager、SQLiteStudio等

 

 

二、对常用的一些方法进行解释如下:

OpaquePointer: *db,数据库句柄,跟文件句柄FIFL类似,这里是sqlite3指针;

sqlite3_stmt: *stmt,相当于ODBC的Command对象,用于保存编译好的SQL语句;

sqlite3_open(): 打开数据库,没有数据库时创建;

sqlite3_exec(): 执行非查询的SQL语句;

sqlite3_step(): 在调用sqlite3_prepare后,使用这个函数在记录集中移动;

sqlite3_close():关闭数据库文件;

sqlite3_column_text():取text类型的数据;

sqlite3_column_blob():取blob类型的数据;

sqlite3_column_int():取int类型的数据;

 

三、使用SQLiteStudio创建数据库,然后导出到桌面,再拖到项目中,最后通过代码拷贝到Documens下进行操作,并获取数据库路径

   

Person.swift

//  Person.swift
//  swiftDemo
//
//  Created by 夏远全 on 2017/2/20.
//  Copyright © 2017年 夏远全. All rights reserved.
//

import UIKit

class Person: NSObject {

    var name:String?
    var password:String?
    var email:String?
    var age:Int?
}

DatabaseOperation.swift

(1)打开数据库

    //不透明指针,对应C语言中的void *,这里指sqlit3指针
    private var db:OpaquePointer? = nil
    
    //初始化方法打开数据库
    required init(dbPath:String) {
        print("db path:" + dbPath)
        
        //String类的路径,转换成cString
        let cpath = dbPath.cString(using: .utf8)
        
        //打开数据库
        let error = sqlite3_open(cpath!,&db)
        
        //数据库打开失败
        if  error != SQLITE_OK {
            sqlite3_close(db)
        }
    }

(2)关闭数据库

    //关闭数据库
    deinit {
        self.closeDB()
    }
    func closeDB() -> Void {
        sqlite3_close(db)
    }

(3)创建表

//创建表
func creatTable() -> Bool {
//sql语句
let sql = "CREATE TABLE UserTable(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,username TEXT NOT NULL, password TEXT NOT NULL,email TEXT NOT NULL,age INTEGER)"
        
//执行sql语句
let excuResult = sqlite3_exec(db, sql.cString(using: .utf8), nil, nil, nil)
        
//判断是否执行成功
if excuResult != SQLITE_OK {
     return false
   }
     return true
}

(4)插入数据

//插入数据
    func addUser(user:Person) -> Bool {
        
        //sql语句
        let sql = "INSERT INTO UserTable(username,password,email,age) VALUES(?,?,?,?);";
        
        //sql语句转换成cString类型
        let cSql = sql.cString(using: .utf8)
        
        //sqlite3_stmt指针
        var stmt:OpaquePointer? = nil
        
        //编译
        let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)
        
        //判断如果失败,获取失败信息
        if prepare_result != SQLITE_OK {
            sqlite3_finalize(stmt)
            if (sqlite3_errmsg(self.db)) != nil {
                let msg = "SQLiteDB - failed to prepare SQL:\\(sql)"
                print(msg)
            }
            return false
        }
        
        //绑定参数
        //第二个参数,索引从1开始
        //最后一个参数为函数指针
        sqlite3_bind_text(stmt, 1, user.name!.cString(using: .utf8), -1, nil)
        sqlite3_bind_text(stmt, 2, user.password!.cString(using: .utf8), -1, nil)
        sqlite3_bind_text(stmt, 3, user.email!.cString(using: .utf8), -1, nil)
        sqlite3_bind_int(stmt, 4, Int32(Int(user.age!)))
        
        //step执行
        let step_result = sqlite3_step(stmt)
        
        //判断执行结果
        if step_result != SQLITE_OK && step_result != SQLITE_DONE {
            sqlite3_finalize(stmt)
            if (sqlite3_errmsg(self.db)) != nil {
                let msg = "SQLiteDB - failed to execute SQL:\\(sql)"
                print(msg)
            }
            return false
        }
        
        //finalize
        sqlite3_finalize(stmt)
        
        return true
    }

(5)查询数据

//查询数据
    func readAllUsers() -> [Person] {
        
        //声明一个Person对象数组(查询的信息会添加到数组中)
        var userArr = [Person]()
        
        //查询sql语句
        let sql = "SELECT * FROM UserTable;";
        
        //sqlite3_stmt指针
        var stmt:OpaquePointer? = nil
        let cSql = sql.cString(using: .utf8)
        
        //编译
        let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)
        if prepare_result != SQLITE_OK {
            sqlite3_finalize(stmt)
            if (sqlite3_errmsg(self.db)) != nil {
                let msg = "SQLiteDB - failed to prepare SQL:\\(sql)"
                print(msg)
            }
        }
        
        //step
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            let user = Person()
            
            //循环从数据库数据,添加到数组
            let cName = UnsafePointer(sqlite3_column_text(stmt, 0))
            let cPwd = UnsafePointer(sqlite3_column_text(stmt, 1))
            let cEmail = UnsafePointer(sqlite3_column_text(stmt, 2))
            let cAge = sqlite3_column_int(stmt, 3)
            
            user.name = String.init(cString: cName!)
            user.password = String.init(cString: cPwd!)
            user.email = String.init(cString: cEmail!)
            user.age = Int(cAge)
            
            userArr += [user]
        }
        
        //finalize
        sqlite3_finalize(stmt)
        
        return userArr
    }

(6)更新数据

//更新数据
    func updateUser(name:String,toName:String) -> Bool {
        
        //更新sql语句
        let sql = "update UserTable set username = \'\\(toName)\' where username = \'\\(name)\'";
        
        //sqlite3_stmt指针
        var stmt:OpaquePointer? = nil
        let cSql = sql.cString(using: .utf8)
        
        //编译sql
        let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)
        
        //判断如果失败,获取失败信息
        if prepare_result != SQLITE_OK {
            sqlite3_finalize(stmt)
            if (sqlite3_errmsg(self.db)) != nil {
                let msg = "SQLiteDB - failed to prepare SQL:\\(sql)"
                print(msg)
            }
            return false
        }
        
        //step执行
        let step_result = sqlite3_step(stmt)
        
        //判断执行结果,如果失败,获取失败信息
        if step_result != SQLITE_OK && step_result != SQLITE_DONE {
            sqlite3_finalize(stmt)
            if (sqlite3_errmsg(self.db)) != nil {
                let msg = "SQLiteDB - failed to execute SQL:\\(sql)"
                print(msg)
            }
            return false
        }
        
        //finalize
        sqlite3_finalize(stmt)
        
        return true
    }

(7)删除数据

//删除数据
    func deleteUser(username:String) -> Bool {
        
        //删除sql语句
        let sql = "delete from UserTable where username = \'\\(username)\'";
        
        //sqlite3_stmt指针
        var stmt:OpaquePointer? = nil
        let cSql = sql.cString(using: .utf8)
        
        //编译sql
        let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -1, &stmt, nil)
        
        //判断如果失败,获取失败信息
        if prepare_result != SQLITE_OK {
            sqlite3_finalize(stmt)
            if (sqlite3_errmsg(self.db)) != nil {
                let msg = "SQLiteDB - failed to prepare SQL:\\(sql)"
                print(msg)
            }
            return false
        }
        
        //step执行
        let step_result = sqlite3_step(stmt)
        
        //判断执行结果,如果失败,获取失败信息
        if step_result != SQLITE_OK && step_result != SQLITE_DONE {
            sqlite3_finalize(stmt)
            if (sqlite3_errmsg(self.db)) != nil {
                let msg = "SQLiteDB - failed to execute SQL:\\(sql)"
                print(msg)
            }
            return false
        }
        
        //finalize
        sqlite3_finalize(stmt)
        
        return true
    }

(8)复制数据库路径

//将Bundle.main路径下的数据库文件复制到Documents下
    class func loadDBPath() -> String {
        
        //声明一个Documents下的路径
        let dbPath = NSHomeDirectory() + "/Documents/RWDataTest.db"
        
        //判断数据库文件是否存在
        if !FileManager.default.fileExists(atPath: dbPath) {
            
            //获取安装包内是否存在
            let bundleDBPath = Bundle.main.path(forResource: "RWDataTest", ofType:"db")!
            
            //将安装包内的数据库到Documents目录下
            do {
                try FileManager.default.copyItem(atPath: bundleDBPath, toPath: dbPath)
            } catch let error as NSError {
                print(error)
            }
        }
        
        return dbPath
    }

ViewController.swift测试

//  Created by 夏远全 on 2017/1/13.
//  Copyright © 2017年 夏远全. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //打开数据库
        let path = DatabaseOperations.loadDBPath()
        let dbOpearion = DatabaseOperations.init(dbPath:path)
        print(path)
        
        //添加一张表
        let person:Person = Person()
        person.name = "张三"
        person.password = "123566"
        person.email = "zhangsan@163.com"
        person.age = 30
        
        //插入一条信息,通过Person对象来传值
        let addBool = dbOpearion.addUser(user: person)
        print(addBool)
        
        //查询
        let personArray:[Person] = dbOpearion.readAllUsers()
        print("共搜索到:\\(personArray.count) 条数据")
        
        //更新
        let updateBool = dbOpearion.updateUser(name: "张三", toName: "李四")
        print(updateBool)
        
        //删除
        let deleteBool = dbOpearion.deleteUser(username: "李四")
        print(deleteBool)
        
        //关闭数据库
        dbOpearion.closeDB()
    }
}

 

以上是关于swift:sqlite3的使用的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

如何使用 Swift 从 tableview 和 sqlite3 中删除

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?

Swift SQLITE3 插入/选择问题

swift常用代码片段

在 Swift 中为 macOS 构建框架时出错