1、SQLite

说起 SQLite,它和你熟知的 MySQL 一样,都是关系型数据库管理系统,但与后者不同的地方在于,它完全不需要对应的独立服务器!

一般说起来,SQLite 都是以文件的形式存在,大多用在应用的内嵌储存里。通过在应用代码里加载 SQLite 库,就可以很方便地直接存取 SQLite 文件里的数据了。

SQLite 由 C 编写,所以你懂的,要调用它的库,一定也是 C 语言,什么指针啦……


要访问 SQLite 数据库里的数据——毕竟还是数据库,所以你只需要像访问其他数据库一样,在程序内使用 SQL 即可。




2、FMDB

当然了,虽然 Swift 本身也可以桥接 C 语言来使用 SQLite 库,但这样太麻烦了,尤其 C 不是 OOP ,你可能一下子用起来也不习惯,这里我们介绍最流行的第三方库:FMDB (Flying Meat Database)。

它把 SQLite 库的所有功能用 OC 封装,这样我们用起来就方便多了。得益于 Xcode 的高能,我们可以直接全自动地把 FMDB 的 OC 代码桥接为 Swift 。




3、导入代码

从 Github 下载 FMDB 项目文件之后,到它的  src 目录中,将所有的  .h 和  .m 文件(OC 代码文件)拖入你 Xcode 要使用 FMDB 的项目的文件目录中,这时候 Xcode 会检测到你导入了 Objective-C 的代码,会提示你是否创建桥接文件,确认之后,桥接文件会自动创建。

接下来编辑生成的桥接文件,在里边加入一句话:

[Swift] 纯文本查看 复制代码
#import "FMDB.h"


这样,就导入成功了。




4、链接 SQLite 库

当然了,只导入了 FMDB 是不够的,它不能直接操作 SQLite 文件,我们还需要给项目链接 FMDB 所依赖的 SQLite 库,如果你现在直接编译,会遇到 39 个错误。

在 Swift 里使用 SQLite 数据库 在 Xcode 项目里为 FMDB 添加 SQLite 库链接

在 Swift 里使用 SQLite 数据库 - 敏捷大拇指 - 在 Swift 里使用 SQLite 数据库  在 Xcode 项目里为 FMDB 添加 SQLite 库链接

在 Xcode 项目里为 FMDB 添加 SQLite 库链接

  • 点击你 Xcode 左侧文件树最顶端的项目文件;
  • 在中间一栏选择你的编译目标;
  • 在右侧选择“Build Phases”选项卡;
  • 在“Link Binary With Libaraies”选项中点击加号;
  • 搜索并添加  libsqlite3.0.dylib 。





5、使用 FMDB

我们给 FMDB 传入数据库地址即可,如果对应地址的文件不存在,则 FMDB 会尝试创建文件然后打开。

你也可以不传入文件地址,这样的话 FMDB 就会把数据库创建在临时位置,一旦断开,文件也就没了。


[Swift] 纯文本查看 复制代码
let documents = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
let fileURL = documents.URLByAppendingPathComponent("test.sqlite")
 
let database = FMDatabase(path: fileURL.path)


使用之前需要先打开数据库,使用如下语句:

[Swift] 纯文本查看 复制代码
if !database.open() {
    print("Unable to open database")
    return
}


如果执行成功,说明已经成功打开数据库,接下来就可以执行 SQL 了:

[Swift] 纯文本查看 复制代码
do {
    try database.executeUpdate("create table test(x text, y text, z text)", values: nil)
    try database.executeUpdate("insert into test (x, y, z) values (?, ?, ?)", values: ["a", "b", "c"])
    try database.executeUpdate("insert into test (x, y, z) values (?, ?, ?)", values: ["e", "f", "g"])
 
    let rs = try database.executeQuery("select x, y, z from test", values: nil)
    while rs.next() {
        let x = rs.stringForColumn("x")
        let y = rs.stringForColumn("y")
        let z = rs.stringForColumn("z")
        print("x = \(x); y = \(y); z = \(z)")
    }
} catch let error as NSError {
    print("failed: \(error.localizedDescription)")
}


这里执行语句可以是所有的 SQL,使用  ? 作为占位符,然后把要写入的值放到后边的参数数组里作为形式参数传入,注意占位符的数量一定要和数组长度相等!

执行完毕之后,关闭数据库:

[Swift] 纯文本查看 复制代码
database.close()


当然了,实际使用当中,你应该在创建一个 Model 来管理数据库的存取,而不是直接在代码中执行 SQL,这样才符合 OOP 的设计原则。




6、了解更多

http://www.sqlite.org

github.com/ccgus/fmdb

http://www.theappguruz.com/blog/use-sqlite-database-swift




作者:R0uter