一些廢話git
最近學習了一下iOS的第三方封裝的sqlite數據庫fmdb,因而把學習的心得進行了整理。內容只是涉及一些簡單的操做:增,刪,改,查。github
與其說是一篇fmdb的學習心得,不如說是sqlite的學習心得,由於fmdb自己很是簡單易用,開發中須要處理的主要是一些sqlite語句。因此但願這篇文章能給像我這樣的開發新手、對sqlite瞭解很少的人提供幫助。心得中若有錯誤也懇請你們指出。sql
首先附上fmdb的git : FMDB數據庫
可使用pod安裝swift
pod 'fmdb'
因爲fmdb是oc寫的,因此在swift下須要橋接一下。學習
import "FMDB.h"
這一部份內容git中已經講的很詳細了,本文涉及到的主要內容以下測試
FMDatabase:數據庫類spa
FMResultSet:數據集合類,對數據庫進行請求後的返回結果code
executeUpdate方法:這個方法執行除了"SELECT"查詢 之外的語句,包括「CREATE, UPDATE, INSERT, ALTER, COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE」sqlite
executeQuery方法:查詢方法,執行「SELECT」語句
使用fmdb的第一步是初始化數據庫,而且在應用的沙盒中建立數據庫文件:
func database()-> FMDatabase { //獲取沙盒路徑, var path = NSSearchPathForDirectoriesInDomains(.DocumentationDirectory, .UserDomainMask, true).first! path = path.stringByAppendingString("\\user.sqlite") //傳入路徑,初始化數據庫,若該路徑沒有對應的文件,則會新建此文件 return FMDatabase.init(path: path) }
*坑:一開始我給NSSearchPathForDirectoriesInDomains()方法傳入的第一個參數是:.DocumentDirectory,這種狀況下真機測試時報錯:error opening!: 14,可模擬器狀況下沒有問題。解決辦法就是把.DocumentDirectory替換爲.DocumentationDirectory便可
func creatTable(){ let db = database() if db.open(){ do{ try db.executeUpdate("CREATE TABLE IF NOT EXISTS user (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,name TEXT, phone TEXT , date DATETIME , headImage DATA )", values: nil) } catch{ print(db.lastErrorMessage()) } } db.close() }
func add(name : String , phone : String){ let db = database() if db.open(){ var update = "INSERT INTO 'user' (name,phone,date) VALUES(?,?,?)" var values = [name,phone,NSDate.init(timeIntervalSinceNow: 0)] do{ try db.executeUpdate(update, values: values) print("insert successfully") } catch{ print(db.lastErrorMessage()) } } db.close() }
func delete(id : Int) { if let selectedID = selectedID{ let db = database() if db.open() { try! db.executeUpdate("DELETE FROM 'user' WHERE id = ?", values:[ selectedID]) } db.close() } }
func set(id : Int , name : String , phone : String){ let db = database() if db.open() { var update = "UPDATE user SET name = ? , phone = ? WHERE id = ?" var values : [AnyObject] = [name,phone,id] do{ try db.executeUpdate(update, values:values) }catch{ print(db.lastErrorMessage()) } } db.close() }
增、刪、改都差很少,用不一樣的關鍵詞,‘?’表明要values中要傳入的數據,一一對應。
在where後添加限制條件,除了'WHERE id = 1',也可使用‘WHERE score < 60’之類的限制條件
也能夠從FMDataBase對象中獲取報錯信息,如:db.lastErrorMessage()
do{ let rs = try db.executeQuery("SELECT * FROM user LIMIT 100", values: nil) while rs.next() { let name = rs.stringForColumn("name") let phone = rs.stringForColumn("phone") let id = rs.longForColumn("id") let date = rs.dateForColumn("date") } }catch{ print(db.lastErrorMessage()) }
"SELECT * FROM user "表示查詢該表中的全部數據,若是隻想請求其中的某一部分數據能夠將*替換。
"SELECT name , phone FROM user " 查詢user表中的name和phone數據。
添加"LIMIT"表示對查詢結果的數量進行限制。
"SELECT * FROM user LIMIT 100"就表示僅查詢一百條數據。
"SELECT * FROM user LIMIT 10 OFFSET 2"offset表示偏移量,該語句表示從第3個數據開始取,取10個。
「SELECT * FROM user ORDER BY id ASC , date DESC」可用order by _ asc 或者desc進行排序。
//查詢分數等於70的數據 db.executeQuery("SELECT * FROM user WHERE score = ? ", values: [70]) //當須要查詢多個數據時須要用AND 或 OR 鏈接條件, 用‘,’間隔會提示語法錯誤 db.executeQuery("SELECT * FROM user WHERE score = ? AND phone = 111 ", values: [70]) //模糊查詢時須要用到LIKE語句,以後的values可傳入固定的內容,也能夠傳入有格式的內容 query = "SELECT * FROM user WHERE name LIKE ? AND phone LIKE ?" values = ["%\(name)%" , "%\(phone)%"] let rs = try db.executeQuery(query, values: values) /* values的格式主要有兩種字符'_'和'%','_'表示單個字符,'%'表示多個字符 "%1%" 表明含有1的字符串 "_1%" 第二位是1的長度不限的字符串 "1%" 1開頭的字符串 若寫成db.executeQuery("SELECT * FROM user WHERE name LIKE '%?%' ", values: [1]),把格式沒有寫在values裏也是錯誤的 ╮(╯_╰)╭ */
調用FMResultSet的.next()方法可得到下一條數據,一般搭配while使用。
經過stringForColumn等方法獲取key對應的數據
while rs.next() { let name = rs.stringForColumn("name") let phone = rs.stringForColumn("phone") let id = rs.longForColumn("id") let date = rs.dateForColumn("date") }
//官方文檔的例子,可直接獲得數據的數量 FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"]; if ([s next]) { int totalCount = [s intForColumnIndex:0]; }