swift3.0: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()
    }
}
复制代码

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/6421840.html ,如需转载请自行联系原作者
相关文章
|
SQL 存储 Oracle
swift微博第25天(SQLite)
swift微博第25天(SQLite)
191 0
swift微博第25天(SQLite)
|
存储 数据库 iOS开发
iOS - Swift SQLite 数据库存储
前言 采用 SQLite 数据库来存储数据。SQLite 作为一中小型数据库,应用 iOS 中,跟前三种保存方式相比,相对比较复杂一些。 注意:写入数据库,字符串可以采用 char 方式,而从数据库中取出 char 类型,当 char 类型有表示中文字符时,会出现乱码。
1154 0
|
SQL 数据库 数据库管理
Swift学习第九枪之SQLite的使用
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/51570242 前面写了一部分关于Swift的语法学习,今天要学习的是关于IOS中数据存储的一种存储方式之SQLite的使用。
840 0
|
SQL 数据库 iOS开发
[快速学会Swift第三方库] SQLite.swift篇
[快速学会Swift第三方库] SQLite.swift篇 SQLite.swift 是一个使用纯 Swift 语言封装 SQLite3 的操作框架。 特性: 简单的查询和参数绑定接口 安全、自动类型数据访问 隐式提交和回滚接口 开发者友好的错误处理和调试 文档完善 通过广泛测试 目录 快速学会Swift第三方库 SQLiteswift篇 目录 编码之
4742 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
91 2
|
2月前
|
监控 API Swift
用Swift开发iOS平台上的上网行为管理监控软件
在当今数字化时代,随着智能手机的普及,人们对于网络的依赖日益增加。然而,对于一些特定场景,如家庭、学校或者企业,对于iOS设备上的网络行为进行管理和监控显得尤为重要。为了满足这一需求,我们可以利用Swift语言开发一款iOS平台上的上网行为管理监控软件。
196 2
|
3月前
|
监控 Swift iOS开发
局域网计算机监控软件中利用Swift构建iOS端的移动监控应用
在局域网计算机监控软件的开发中,构建iOS端的移动监控应用是一项关键任务。本文将介绍如何利用Swift语言实现这一目标,通过多个代码示例展示关键功能的实现。
225 1
|
3月前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
67 0
|
5月前
|
JavaScript 前端开发 PHP
用swift开发ios移动端app应用初体验
直接跟着 apple 官方的 SwiftUI 教程跑的,写惯了 javascript 奔放的代码,很多语法理解起来还是有点费劲
58 1

相关课程

更多