一些废话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]; }