SQLiteDB 是一个好用的第三方封装库,用于操作 SQLite 数据库。具体的配置和使用方法可以看我的另一篇文章:Swift - 操作SQLite数据库(引用SQLite3库)
这里主要讲解下最新版本中新增的 SQLTable.swift
1,SQLTable是做什么用的?
有时我们从数据库中把数据查询出来以后,为了映射成实体类对象,需要遍历查询结果集,一个个给实体类对象赋值。
同样当实体对象属性修改后,如果想保存到数据库,又需要把对象属性取出来拼成一个SQL语句执行。
这样就比较麻烦。
SQLTable 的作用就是把让实体类继承 SQLTable,它就会自行将实体类跟数据库表作关联映射。只要操作实体类对象就可以直接进行数据的读取,修改,新增操作。
2,SQLTable的原理
查看 SQLTable.swift 源码可以看出,其内部实现使用到了Swift的反射,通过遍历对象内的所有属性,从而自动拼接成相应的SQL语句来执行。
3,SQLTable的使用
比如我们有一张联系人表:
代码如下 | 复制代码 |
t_user( uid integer primary key, uname varchar(20), mobile varchar(20) ) |
(1)首先创建一个联系人实体类,继承SQLTable
代码如下 | 复制代码 |
class User:SQLTable { var uid = -1 var uname = "" var mobile = "" init() { //对应的数据库表 super.init(tableName:"t_user") } //设置主键(如果主键字段名就是id的话,这个可以省去,不用覆盖) override func primaryKey() -> String { return "uid"; } required convenience init(tableName:String) { self.init() } } |
(2)查询出所有数据
按id升序排列(后面可以跟多个排序字段)
代码如下 | 复制代码 |
let data:[User] = User().allRows("uid ASC") for item in data { print("\(item.uid):\(item.uname):\(item.mobile)") } |
(3)保存数据
如果实体类主键在数据库找不到对应记录则为新增。否则便为修改。
代码如下 | 复制代码 |
let user1 = User() user1.uname = "hangge.com" user1.mobile = "123" if user1.save().success { print("数据插入成功") } |
4,完整的样例代码
代码如下 | 复制代码 |
import UIKit class ViewController: UIViewController { var db:SQLiteDB! override func viewDidLoad() { super.viewDidLoad() //获取数据库实例 db = SQLiteDB.sharedInstance() //如果表还不存在则创建表 db.execute("create table if not exists t_user(uid integer primary key,uname varchar(20),mobile varchar(20))") //清空数据库 db.execute("delete from t_user") //插入三条数据 print("------ 开始插入数据 ------") let user1 = User() user1.uname = "张三" user1.mobile = "123" if user1.save().success { print("数据插入成功") } let user2 = User() user2.uname = "李四" user2.mobile = "456" if user2.save().success { print("数据插入成功") } let user3 = User() user3.uname = "王五" user3.mobile = "110" if user3.save().success { print("数据插入成功") } //查询出所有的用户(按id排序) print("\n------ 开始查询所有数据 ------") let data:[User] = User().allRows("uid ASC") for item in data { print("\(item.uid):\(item.uname):\(item.mobile)") } //修改数据 print("\n------ 修改第二条数据 ------") data[1].mobile = "hangge.com" if data[1].save().success { print("数据修改成功") } //再次查询出所有的用户(按id排序) print("\n------ 再次查询所有数据 ------") let data2:[User] = User().allRows("uid ASC") for item in data2 { print("\(item.uid):\(item.uname):\(item.mobile)") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } |
控制台输出如下:
时间: 2024-10-10 02:39:58