iOS开发之FMDB入门学习心得(Swift版)

iOS开发之FMDB入门学习心得(Swift版)

一些废话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")
}
  • 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];
}
相关文章
相关标签/搜索