swift:sqlite3的使用

介绍

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

二、我使用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 = "[email protected]"
        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()
    }
}
时间: 2024-08-03 15:10:05

swift:sqlite3的使用的相关文章

iOS开发——数据持久化Swift篇&(三)SQLite3

SQLite3 使用 1 //******************** 5.3 SQLite3存储和读取数据 2 func use_SQLite3() 3 { 4 //声明一个Documents下的路径 5 var dbPath = NSHomeDirectory() + "/Documents/SwiftClassDB.sqlite" 6 7 //判断数据库文件是否存在 8 if !NSFileManager.defaultManager().fileExistsAtPath(dbP

swift中使用sqlite3

import Foundation /** 1. 打开数据库 2. 如果没有数据表,需要首先创表 3. 数据操作 */ class SQLite { var db: COpaquePointer = nil /// 打开数据库 /// /// :param: dbname 数据库名称 /// /// :returns: 是否打开成功 func openDatabase(dbname: String) -> Bool { // UnsafePointer<Int8> UnsafePoint

swift分布式存储多节点部署

1.机器 192.168.1.211    Proxy Node 192.168.1.212    Storage Node 192.168.1.213    Storage Node 192.168.1.214    Storage Node 系统为SLES11sp1 2.配置软件源 因为公司服务器无法连外网,所以配置局域网源和本地源来搭建环境 上传ISO镜像文件到各台机器 SLES-11-SP4-DVD-x86_64-GM-DVD1.iso 每台机器挂载镜像,配置本地源 # mkdir /m

swift目录

第二部分 实 战 第3章 UI基础 138 3.1 iOS开发平台限制和方式 138 3.2 iOS SDK介绍 141 第4章 UI开发与控件 182 4.1 窗口与视图 182 4.1.1 UIScreen.UIWindow和UIView 182 4.1.2 界面旋转和大小处理 188 4.2 图片资源的使用 191 4.3 UILabel 201 4.4 UITextField 206 4.5 UIButton 216 4.6 UITableView 221 4.6.1 UITableVi

OpenStack Swift集群部署流程与简单使用

转载:http://www.cnblogs.com/fczjuever/p/3224022.html 之前介绍了<OpenStack Swift All In One安装部署流程与简单使用>,那么接下来就说一说Swift集群部署吧. 1. 简介 本文档详细描述了使用两台PC部署一个小型Swift集群的过程,并给出一些简单的使用实例.本文档假定如下前提条件: 使用Ubuntu操作系统. 每台机器都运行Swift的所有服务,既是Proxy Server,又是Storage Server,用户可以向

在Swift中实现 oc与swift的混编

在Swift中想要引用OC头文件(import),可采用混编的方法,这里以sqlite为例,采用OC-Swift桥的方式实现添加头文件1引入sqlite数据库的库文件 打开工程配置文件,在build Phases选项标签的第三个选项中添加sqlite3 2.先创建桥文件 command + N键选择创建头文件 写一个名字 将要引入的文件在这个Header桥文件里进行引入就行,即将import 语句写在这里 3 配置桥接文件打开工程配置文件,在build setting选项标签搜索框里输入brid

Swift中使用SQLite的配置方法

Swift 中使用 SQLite 1.准备工作 添加 libsqlite3.dylib 创建 SQLite-Bridge.h SQLite3 框架是一套 C 语言的框架,因此需要添加桥接文件 选择 项目-TARGETS-Build Settings,搜索 Bridg 在 Objective-C Bridging Header 中输入 项目名/SQLite-Bridge.h 如果之前设置过桥接文件,可以直接使用 导入SQLite3.thd头文件 导入成功

Awesome Swift

Awesome Swift A collaborative list of awesome Swift resources,inspired by awesome-python and listed on awesome-awesomeness. Feel free to contribute! Awesome Swift Demo Apps iOS Apple Watch OS X Dependency Managers Guides Editor Support Vim Libs Anima

---纯Swift的中SQLite 的使用

SQLite.swift 是一个使用纯 Swift 语言封装 SQLite3 的操作框架. 特性: 简单的查询和参数绑定接口 安全.自动类型数据访问 隐式提交和回滚接口 开发者友好的错误处理和调试 文档完善 通过广泛测试 示范代码: import Foundation /** 1. 打开数据库 2. 如果没有数据表,需要首先创表 3. 数据操作 */ class SQLite { var db: COpaquePointer = nil /// 打开数据库 /// /// :param: dbn