美文网首页
Swift5-SQLite三方库FMDB使用-多线程

Swift5-SQLite三方库FMDB使用-多线程

作者: Jesscia_Liu | 来源:发表于2020-05-19 14:41 被阅读0次

FMDB库git下载地址:https://github.com/ccgus/fmdb

一、FMDB配置

  • 1.使用pod或者直接把fmdb文件夹拖入项目中
  • 2.在桥接文件中#import "FMDB.h"
  • 3.创建SQLiteManager.swift类封装crud
import UIKit

// 数据库管理类
@objcMembers class SQLiteManager: NSObject {
    // 创建单例
    private static let manger: SQLiteManager = SQLiteManager()
    private override init(){}
    
    //对外返回单例对象
    class func sharedManager() -> SQLiteManager {
        return manger
    }
     
    // 数据库名称
    private let dbName = "Test.db"
    
    // 数据库地址
    lazy var dbURL: URL = {
        // 根据传入的数据库名称拼接数据库的路径
        let fileURL = try! FileManager.default
            .url(for: .applicationSupportDirectory, in: .userDomainMask,
                 appropriateFor: nil, create: true)
            .appendingPathComponent(dbName)
        printLog("数据库地址:", fileURL)
        return fileURL
    }()
    
    // FMDatabase对象(用于对数据库进行操作)
    lazy var db: FMDatabase = {
        let database = FMDatabase(url: dbURL)
        return database
    }()
     
    // FMDatabaseQueue对象(用于多线程事务处理)
    lazy var dbQueue: FMDatabaseQueue? = {
        // 根据路径返回数据库
        let databaseQueue = FMDatabaseQueue(url: dbURL)
        return databaseQueue
    }()
}

二、基本数据库操作crud示例

  • 全部写在extension SQLiteManager{ }中

1.创建User表


    /**
     创建用户表
    */
    class func createUserTable() {
        // 编写SQL语句(id: 主键  name和age是字段名)
        let sql = "CREATE TABLE User (id integer, name text, account text, userId integer)"
         
        SQLiteManager.sharedManager().dbQueue?.inDatabase({ (db) in
            if db.open(){
                do {
                   try db.executeUpdate(sql, values: [])
                } catch let error as NSError {
                   printLog("error: \(error)")
                }
            }
            db.close()
        })
    }

2.插入User信息

    /**
     插入用户登录信息
    */
    class func insertUser(name: String, account: String, uuid: String, userId: Int) {

        let sql = "INSERT INTO User (id, name, account, userId) VALUES (?,?,?,?)"

        SQLiteManager.sharedManager().dbQueue?.inDatabase({ (db) in
            if db.open(){
                do {
                    try db.executeUpdate(sql, values: [1, name, account, uuid, userId])

                } catch let error as NSError {
                            printLog("error: \(error)")
                }
            }
            db.close()
        })
    }

3.删除User登录信息

    /**
     删除用户登录信息
    */
    class func deleteUserInfo() {
        
        let sql = "DELETE FROM User"

        SQLiteManager.sharedManager().dbQueue?.inDatabase({ (db) in
            if db.open(){
                do {
                    try db.executeUpdate(sql, values: [])
                } catch let error as NSError {
                    printLog("deleteUser error: \(error)")
                }
            }
            db.close()
            
        })
    }
    

4.更新User信息

    /**
    更新用户信息
    */
    class func updateUser(userId: NSInteger, name: NSString){
       let sql = "UPDATE ExamInfo SET name=? WHERE userId=?"

       SQLiteManager.sharedManager().dbQueue?.inDatabase({ (db) in
           if db.open(){
               do {
                   try db.executeUpdate(sql, values: [name,userId])

               } catch let error as NSError {
                   printLog("error: \(error)")
               }
           }
           db.close()
           
       })
    }

4.查询User信息

    /**
     查询用户userId
    */
    class func selectUserId()->(Int) {
        
        var userId: Int = 0
        
        let sql = "SELECT * FROM User WHERE id = 1"
         
        SQLiteManager.sharedManager().dbQueue?.inDatabase({ (db) in

            if db.open() {
                if let res = db.executeQuery(sql, withArgumentsIn: []){
                    // 遍历输出结果
                    while res.next() {
                        let id = res.int(forColumn: "id")
                        let userIdTmp = res.int(forColumn: "userId")
                        let sex = res.bool(forColumn: "sex")
                        let account = res.string(forColumn: "account") ?? ""
                        printLog(id, userIdTmp, sex, account)
                        userId = Int(userIdTmp)
                    }
                }else{
                    printLog("userId 查询失败")
                }
            }
            db.close()
            
        })
        return userId
    }

三、其他常用数据库操作

1.动态添加表字段

    /**
     动态添加表字段
    */
    class func updateUserTable(){

        SQLiteManager.sharedManager().dbQueue?.inDatabase({ (db) in
            if db.open(){
                do {
                    if !db.columnExists("sex", inTableWithName: "User") {
                        let sql = String(format: "ALTER TABLE %@ ADD %@ %@", "User","sex","integer")
                        try db.executeUpdate(sql, values: [])
                    }
                } catch let error as NSError {
                   printLog("error: \(error)")
                }
            }
            db.close()
        })
    }

四、SQL语句拓展

参见 W3School-SQL 教程

五、参考文献

Hangge.com - Swift - 第三方SQLite库FMDB使用详解-系列

相关文章

网友评论

      本文标题:Swift5-SQLite三方库FMDB使用-多线程

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