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() } }
|
控制台輸出如下: