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

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];
}

 

转载于:https://my.oschina.net/fadoudou/blog/730609

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值