?什么是FMDB
- FMDB是iOS平台的SQLite数据库框架
- FMDB以OC的方式封装了SQLite的C语言API
?FMDB的优点
- 使用起来更加面向对象,省去了很多麻烦、繁杂的C语言代码
- 提供了多线程数据库的操作方法,有效的防止数据混乱
FMDB有三个主要的类
?FMDatabase
- 一个FMDBDatabase对象就代表一个单独的SQLite数据库
- 用来执行SQL语句
?FMResultSet
- 使用FMDatabase执行查询后的结果集
?FMDatabaseQueue
- 用于在多线程中查询或者更新,它是线程安全的
使用
- 在github上下载文件,导入文件 包括第二个文件FMDB及第一个文件里面的为swift提供的头文件
- 添加并配置桥接文件 并#import
- 导入sqlite3.tbd框架 编译看是否报错
下载地址 https://github.com/ccgus/fmdb
代码:
在APPdelegate里面创建数据库执行以下代码 SQLiteManager.shareManager().openDB("person.sqlite")
FMDB管理类
import UIKit
class SQLiteManager: NSObject {
privatestaticlet manager: SQLiteManager = SQLiteManager()
/// 单粒
classfunc shareManager() -> SQLiteManager {
return manager
}
var db: FMDatabase?
/**
* 打开数据库
数据库的关闭:
1.一般在服务端使用数据库要使用完一次就要立刻关闭防止数据混乱
2.客户端不存在多个运用程序使用一个数据库的情况,不用关闭,可以减少性能消耗
*/
func openDB(DBName: String)
{
// 1.根据传入的数据库名称拼接数据库路径
let path = docDir(DBName)
print(path)
// 2.创建数据库对象
db = FMDatabase(path: path)
// 3.打开数据库
// open方法特点: 如果指定路径对应的数据库文件已经存在, 就会直接打开如果指定路径对应的数据库文件不存在, 就会创建一个新的
if !db!.open()
{
print("打开数据库失败")
return
}
// 4.创建表
creatTable()
}
func docDir(str:String) -> String
{
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! asNSString
// return path.stringByAppendingPathComponent((self as NSString).lastPathComponent)
return path.stringByAppendingPathComponent((str asNSString).lastPathComponent)
}
privatefunc creatTable()
{
// 1.编写SQL语句
let sql = "CREATE TABLE IF NOT EXISTS T_Person( \n" +
"id INTEGER PRIMARY KEY AUTOINCREMENT, \n" +
"name TEXT, \n" +
"age INTEGER \n" +
"); \n"
// 2.执行SQL语句
// 注意点: 在FMDB中除了查询意外, 都称之为更新
ifdb!.executeUpdate(sql, withArgumentsInArray: nil)
{
print("创建表成功")
}else
{
print("创建表失败")
}
}
Model处理数据类
import UIKit
class Person: NSObject {
var id: Int = 0
var age: Int = 0
var name: String?
// MARK: - 执行数据源CRUD的操作
classfunc loadPersons() -> [Person]
{
let sql = "SELECT * FROM T_Person;"
let res = SQLiteManager.shareManager().db!.executeQuery(sql, withArgumentsInArray: nil)
var models = [Person]()
// next取出一行数据
while res.next()
{
let p = Person()
let num = res.intForColumn("id")
let name = res.stringForColumn("name")
let age = res.intForColumn("age")
// print("num = \(num), name = \(name), age = \(age)")
p.id = Int(num)
p.name = name
p.age = Int(age)
models.append(p)
}
return models
}
/**
插入一条记录
*/
func insertPerson() -> Bool
{
assert(name != nil, "必须要给name赋值")
// 1.编写SQL语句
let sql = "INSERT INTO T_Person" +
"(name, age)" +
"VALUES" +
"(?, ?);"
// 2.执行SQL语句
// return SQLiteManager.shareManager().db!.executeUpdate(sql, withArgumentsInArray: nil)
returnSQLiteManager.shareManager().db!.executeUpdate(sql, name!, age)
}
// MARK: - 系统内部方法
init(dict: [String: AnyObject])
{
super.init()
setValuesForKeysWithDictionary(dict)
}
overrideinit()
{
super.init()
}
overridefunc setValue(value: AnyObject?, forUndefinedKey key: String) {
}
overridevar description: String
{
return"id = \(id), age = \(age), name = \(name)" }
}
}