IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> swift定义iOS数据库框架3 -> 正文阅读

[移动开发]swift定义iOS数据库框架3

分析表SQL语句构建过程

请添加图片描述

分析动态构建表

需要实现两个功能:

提供绑定数据方法

提供一个类,封装整个SQL的管理:绑定、转换,包括swift到数据库及其方向的操作。

//作用:封装SQL,同时绑定数据(类型映射)
public final class Statement {
    
    //第一步:提供构造方法->执行创建表SQL语句
    fileprivate var handle: OpaquePointer? = nil
    fileprivate let connection: Connection
    //提供构造方法
    init(_ connection: Connection, _ SQL: String) throws {
        self.connection = connection
        //执行创建表操作
        try connection.check(sqlite3_prepare_v2(connection.handle, SQL, -1, &handle, nil))
    }
    //析构函数
    deinit {
        sqlite3_finalize(handle)
    }

SQL描述生成过程
第二步:绑定数据 =>提供原始绑定方法

//1、原始方法->绑定数据
//Swift属性值->绑定到->数据库
//为什么搞了一个Binding?
//父类引用指向子类实例对象(多态)
fileprivate func bind(_ value: Binding?, atIndex idx: Int) {
    if value == nil {
        //一一对应
        //绑定的是nil空值->"NULL"
        sqlite3_bind_null(handle, Int32(idx))
    } else if let value = value as? String {
        sqlite3_bind_text(handle, Int32(idx), value, -1, SQLITE_TRANSIENT)
    } else if let value = value {
        fatalError("tried to bind unexpected value \(value)")
    }
}

绑定方法重载=>循环遍历

	//重置(重新赋值)
fileprivate func reset(clearBindings shouldClear: Bool = true) {
    sqlite3_reset(handle)
    if (shouldClear) {
        sqlite3_clear_bindings(handle)
    }
}
//参数:字典
public func bind(_ values: [String: Binding?]) -> Statement {
    //绑定之前->先重置
    reset()
    //循环遍历字段名称和字段值
    for (name, value) in values {
        //根据字段名称->获取字段在数据库里面的下标
        //例如:create table t_user (name TEXT, sex TEXT)
        //这个表中字段下标
        //name->0
        //sex->1
        //...
        let idx = sqlite3_bind_parameter_index(handle, name)
        //如果不存在抛异常即可,不允许绑定
        guard idx > 0 else {
            fatalError("parameter not found: \(name)")
        }
        //绑定
        bind(value, atIndex: Int(idx))
    }
    return self
}

绑定方法重载->提供默认方法(抽象公共功能)

   //参数:数组
    public func bind(_ values: [Binding?]) -> Statement {
        if values.isEmpty {
            return self
        }
        reset()
        guard values.count == Int(sqlite3_bind_parameter_count(handle)) else {
            fatalError("\(sqlite3_bind_parameter_count(handle)) values expected, \(values.count) passed")
        }
        for idx in 1...values.count {
            bind(values[idx - 1], atIndex: idx)
        }
        return self
    }
    public func bind(_ values: Binding?...) -> Statement {
        return bind(values)
    }

执行SQL语句

	//检测数据库
public func step() throws -> Bool {
    return try connection.sync {
        try self.connection.check(sqlite3_step(self.handle)) == SQLITE_ROW
    }
}
//参数列表不同
//参数列表:数组
//discardableResult方法返回值->可以不接受(去除方法返回值警告)
@discardableResult public func run(_ bindings: [Binding?]) throws -> Statement {
    return try bind(bindings).run()
}
//参数列表:字典
@discardableResult public func run(_ bindings: [String: Binding?]) throws -> Statement {
    return try bind(bindings).run()
}
//参数列表:可变参数->具体实现
@discardableResult public func run(_ bindings: Binding?...) throws -> Statement {
    //guard语法->不为空->绑定
    guard bindings.isEmpty else {
        //存在->绑定
        return try run(bindings)
    }
    //不存在(必需调用)->避免缓存->给下一次操作
    reset(clearBindings: false)
    repeat {} while
        try step()
    return self
}

为Connection提供接口

为了方便客户端调用,对已有的一些接口集中到Connection重载:

prepare重载

    //重载一:prepare参数列表
    //参数一:statement语句
    //参数二:bindings->可变参数类型
    public func prepare(_ statement: String, _ bindings: Binding?...) throws -> Statement {
        if !bindings.isEmpty {
            return try prepare(statement, bindings)
        }
        return try Statement(self, statement)
    }
    //重载二:prepare参数列表
    //参数一:statement语句
    //参数二:bindings->数组类型
    public func prepare(_ statement: String, _ bindings: [Binding?]) throws -> Statement {
        return try prepare(statement).bind(bindings)
    }
    //重载三:prepare参数列表
    //参数一:statement语句
    //参数二:bindings->字典类型
    public func prepare(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement {
        return try prepare(statement).bind(bindings)
    }
    //----------------------------------------

run重载

//重载一:run参数列表
//参数一:statement语句
//参数二:bindings->可变参数类型
@discardableResult public func run(_ statement: String, _ bindings: Binding?...) throws -> Statement {
    return try run(statement, bindings)
}
//重载二:run参数列表
//参数一:statement语句
//参数二:bindings->数组类型
@discardableResult public func run(_ statement: String, _ bindings: [Binding?]) throws -> Statement {
    return try prepare(statement).run(bindings)
}
//重载三:run参数列表
//参数一:statement语句
//参数二:bindings->字典类型
@discardableResult public func run(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement {
    return try prepare(statement).run(bindings)
}
//-------------------------结束----------------------
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:19:09  更:2022-03-17 22:20:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 18:40:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码