ios swift sqlite3 简单使用

一.创建Person类

Swift 复制代码
import UIKit

class Person: NSObject {
    
    var name:String? = nil
    var sex:String? = nil
    var age:String? = nil
        
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        
    }

}

二.在使用的地方导入sqlite.3头文件,例如方法都在viewcontroller中使用

Swift 复制代码
import UIKit
import SQLite3

三.viewcontroller数据sqlite的增,删,查,等方法

Swift 复制代码
    //打开数据库表
    func opneDB() -> Bool {
        let docDir:String! = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first
        let fileName:String! = docDir + "/demo1.sqlite"
        if sqlite3_open(fileName, &db) != SQLITE_OK {
            print("打开数据库失败")
            return false
        } else {
            print("打开数据库成功")
            return true
        }
    }

    //创建数据库表
    func creatTable() ->Bool {
        let sql = "CREATE TABLE persontable(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,name TEXT NOT NULL, age TEXT NOT NULL,sex TEXT NOT NULL);"
            // 第1个参数是 数据库db 第2个是要执行的sql 第3,4个是回调  第5个是错误信息
            let result = sqlite3_exec(db, sql, nil, nil, nil)
            return result == SQLITE_OK
    }
    
    
    // 插入数据
    func insert(nameText:String, ageText:String, sexText:String) -> Bool{
        let sql = "insert into persontable(name,age,sex) VALUES(?,?,?);"
        var stmt: OpaquePointer?
        let prepareResult = sqlite3_prepare_v2(db, sql, -1, &stmt, nil)
        if prepareResult != SQLITE_OK {
          sqlite3_finalize(stmt)
          if let msg = sqlite3_errmsg(db) {
            print("insert prepare 发生错误: \(msg)")
          }
          return false
        }
        let name = (nameText as NSString).utf8String
        let age = (ageText as NSString).utf8String
        let sex = (sexText as NSString).utf8String
        sqlite3_bind_text(stmt, 1, name, -1, nil)
        sqlite3_bind_text(stmt, 2, age, -1, nil)
        sqlite3_bind_text(stmt, 3, sex, -1, nil)
        let stepResult = sqlite3_step(stmt)

        if stepResult != SQLITE_OK && stepResult != SQLITE_DONE {
          sqlite3_finalize(stmt)
          if let msg = sqlite3_errmsg(db) {
            print("insert step 发生错误: \(msg)")
          }
          return false
        }
        sqlite3_finalize(stmt)
        return true
      }
    
    
    // 查询数据
    func queryAll()-> [Any]? {
        var persons = [Person]()
        //根据查询条件查询数据
        //let namestr:String = "张三"
        //let sql = "SELECT * FROM persontable WHERE  name LIKE '%\(namestr)%';"
        let sql = "SELECT * FROM persontable ;"
        var stmt: OpaquePointer?
        // 编译
        let prepareResult = sqlite3_prepare_v2(db, sql, -1, &stmt, nil)
        if prepareResult != SQLITE_OK {
          // 关闭语句句柄
          sqlite3_finalize(stmt)
          if let msg = sqlite3_errmsg(db) {
            print("insert prepare 发生错误: \(msg)")
          }
          return []
        }

        while sqlite3_step(stmt) == SQLITE_ROW {
            let person = Person()
            //let index = String.init(cString: sqlite3_column_text(stmt, 0)!)
            let name = String.init(cString: sqlite3_column_text(stmt, 1)!)
            let age = String.init(cString: sqlite3_column_text(stmt, 2)!)
            let sex = String.init(cString: sqlite3_column_text(stmt, 3)!)
            print("查询数据----\(name)--\(age)--\(sex)")
            person.name = name
            person.age = age
            person.sex = sex
            persons.append(person)
        }
        sqlite3_finalize(stmt)
        print("查询数据库成功")
        return persons
      }
    
    //更新列表
    func update(name: String, toName: String) -> Bool {
        //根据条件删除
      let sql = "update persontable set tradename = '\(toName)' where tradename = '\(name)'";
      return self.exec(sql: sql)
    }
    // 删除数据
    func delete(name: String) -> Bool{
      //删除sql语句
      //let sql = "delete from qingmeitable where tradename = '\(name)'"
      let sql = "delete from persontable "
      return self.exec(sql: sql)
    }
    
    // 执行编译sql
    private func exec(sql: String) -> Bool{
      // sqlite3_stmt指针
      var stmt: OpaquePointer?
      // 编译
      let prepareResult = sqlite3_prepare_v2(self.db, sql, -1, &stmt, nil)
      if prepareResult != SQLITE_OK {
        // 关闭语句句柄
        sqlite3_finalize(stmt)
        if let msg = sqlite3_errmsg(db) {
          print("delete prepare 发生错误: \(msg)")
        }
        return false
      }
      let stepResult = sqlite3_step(stmt)
      if stepResult != SQLITE_OK && stepResult != SQLITE_DONE {
        sqlite3_finalize(stmt)
        if let msg = sqlite3_errmsg(db) {
          print("delete step 发生错误: \(msg)")
        }
        return false
      }
      sqlite3_finalize(stmt)
      return true
    }

参考链接

相关推荐
美狐美颜SDK开放平台15 分钟前
跨平台开发实战:直播美颜sdk动态贴纸在 Android / iOS / HarmonyOS 的落地方案
android·ios·harmonyos·美颜sdk·直播美颜sdk·视频美颜sdk·美颜api
2501_9160088915 分钟前
在不越狱前提下导出 iOS 应用文件的过程,访问应用沙盒目录,获取真实数据
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_9151063217 分钟前
Android和IOS 移动应用App图标生成与使用 Assets.car生成
android·ios·小程序·https·uni-app·iphone·webview
虹少侠27 分钟前
基于 WebKit 构建 macOS 多浮窗视频播放的技术实践(含完整产品落地)
前端·macos·swift·webkit
咸甜适中37 分钟前
双色球、大乐透兑奖分析小程序(rust_Tauri + Vue3 + sqlite)
爬虫·rust·sqlite·vue3·tauri2
2501_915918411 小时前
Mac 抓包软件有哪些?Charles、mitmproxy、Wireshark和Sniffmaster哪个更合适
android·ios·小程序·https·uni-app·iphone·webview
2501_915106321 小时前
iOS 抓包绕过 SSL 证书认证, HTTPS 暴力抓包、数据流分析
android·ios·小程序·https·uni-app·iphone·ssl
WeiAreYoung1 小时前
uni-app xcode 制作iOS Notification Service Extension 远程推送图文原生插件
ios·uni-app·xcode
2501_915921439 小时前
iOS App 电耗管理 通过系统电池记录、Xcode Instruments 与克魔(KeyMob)组合使用
android·ios·小程序·https·uni-app·iphone·webview
且去填词16 小时前
Context 详解:如何在微服务链路中传递取消信号与超时控制
ios·iphone