SQLite.swift如何将已有表绑定为Table类型并完成查询操作
你完全可以直接为已有的表创建Table实例,不需要调用建表相关的API,只要你手动定义的表结构和现有数据库的结构匹配即可,具体实现步骤如下:
1. 定义匹配现有表结构的字段和表实例
首先按照你现有MyTable的字段规则,定义对应的Expression和Table对象:
import SQLite // 泛型类型要和数据库里的字段类型严格对应: // 非空TEXT类型用Expression<String>,允许为NULL的TEXT用Expression<String?> // 整型用Expression<Int>/Expression<Int64>,浮点用Expression<Double> let WtName = Expression<String>("WtName") // 如果有其他字段就按照同样规则补充定义,比如: // let id = Expression<Int>("id") // let createTime = Expression<Date?>("create_time") // 直接传入现有表的准确名称实例化Table即可,不需要调用create方法建表 let MyTable = Table("MyTable")
2. 按照官方示例的方式做类型安全查询
定义完成后你就可以直接用SQLite.swift封装的查询API操作现有表,和操作自己创建的表没有任何区别:
// 遍历全表获取所有WtName for row in try db.prepare(MyTable) { print("WtName: \(row[WtName])") } // 条件查询示例:过滤WtName等于指定值的行 let filterRows = MyTable.filter(WtName == "目标名称") for row in try db.prepare(filterRows) { print(row[WtName]) } // 等效你之前scalar写法的示例:取第一个匹配的WtName值 if let firstWtName = try db.pluck(MyTable)?.get(WtName) { print(firstWtName) }
注意事项
- 你定义的
Expression泛型类型、字段名字符串、Table初始化传入的表名,必须和现有数据库的结构完全匹配,否则会触发类型错误或者查询失败 create相关的API只有新建表的时候才需要调用,操作现有表完全不需要执行相关代码- 你之前用
scalar执行原生SQL的方式本身没有问题,只是放弃了SQLite.swift提供的类型安全、自动转义防注入等特性,两种实现方式都可以根据需求选用
内容的提问来源于stack exchange,提问作者NBera
相关产品推荐
相关产品推荐

