iOS开发之FMDB入门学习心得(Swift版)
一些废话
最近学习了一下iOS的第三方封装的sqlite数据库fmdb,于是把学习的心得进行了整理。内容只是涉及一些简单的操作:增,删,改,查。
与其说是一篇fmdb的学习心得,不如说是sqlite的学习心得,因为fmdb本身非常简单易用,开发中需要处理的主要是一些sqlite语句。所以希望这篇文章能给像我这样的开发新手、对sqlite了解不多的人提供帮助。心得中如有错误也恳请大家指出。
安装
首先附上fmdb的git : FMDB
可以使用pod安装
pod 'fmdb'
由于fmdb是oc写的,所以在swift下需要桥接一下。
import "FMDB.h"
主要类以及方法
这一部分内容git中已经讲的很详细了,本文涉及到的主要内容如下
FMDatabase:数据库类
FMResultSet:数据集合类,对数据库进行请求后的返回结果
executeUpdate方法:这个方法执行除了"SELECT"查询 以外的语句,包括“CREATE, UPDATE, INSERT, ALTER, COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE”
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")
}
- intForColumn:
- longForColumn:
- longLongIntForColumn:
- boolForColumn:
- doubleForColumn:
- stringForColumn:
- dateForColumn:
- dataForColumn:
- dataNoCopyForColumn:
- UTF8StringForColumnName:
- objectForColumnName:
数量查询
//官方文档的例子,可直接得到数据的数量
FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];
if ([s next]) {
int totalCount = [s intForColumnIndex:0];
}