18-(掌握)FMDB基本使用
- 什么是FMDB?
FMDB是iOS平臺(tái)的SQLite數(shù)據(jù)庫(kù)框架
FMDB以O(shè)C的方式封裝了SQLite的C語(yǔ)言API
- 什么是FMDB?
- FMDB有什么優(yōu)勢(shì)?
使用起來(lái)更加面向?qū)ο笪ⅲ∪チ撕芏嗦闊⑷哂嗟腃語(yǔ)言代碼
提供了多線程安全的數(shù)據(jù)庫(kù)操作方法统扳,有效地防止數(shù)據(jù)混亂
- FMDB有什么優(yōu)勢(shì)?
- 安裝方式
Cocoapods
- 安裝方式
use_frameworks!
使用dynamic frameworks的方式集成
pod 'FMDB'
手動(dòng)集成(swift)
1. 導(dǎo)入FMDB文件
2. 導(dǎo)入系統(tǒng)依賴庫(kù)sqlite3.0.tbd
3. 建立橋接文件, 并導(dǎo)入需要的頭文件#import "FMDB.h"
- 核心類
FMDatabase
一個(gè)FMDatabase對(duì)象就代表一個(gè)單獨(dú)的SQLite數(shù)據(jù)庫(kù)
用來(lái)執(zhí)行SQL語(yǔ)句
FMResultSet
使用FMDatabase執(zhí)行查詢后的結(jié)果集
FMDatabaseQueue
用于在多線程中執(zhí)行多個(gè)查詢或更新贫橙,它是線程安全的 - 使用步驟
- 打開數(shù)據(jù)庫(kù)
通過(guò)指定SQLite數(shù)據(jù)庫(kù)文件路徑來(lái)創(chuàng)建FMDatabase對(duì)象
文件路徑有三種情況:
具體文件路徑: 如果不存在會(huì)自動(dòng)創(chuàng)建
空字符串@""
:會(huì)在臨時(shí)目錄創(chuàng)建一個(gè)空的數(shù)據(jù)庫(kù);當(dāng)FMDatabase連接關(guān)閉時(shí)贪婉,數(shù)據(jù)庫(kù)文件也被刪除
nil:會(huì)創(chuàng)建一個(gè)內(nèi)存中臨時(shí)數(shù)據(jù)庫(kù),當(dāng)FMDatabase連接關(guān)閉時(shí)料皇,數(shù)據(jù)庫(kù)會(huì)被銷毀
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open]) { NSLog(@"打開成功!"); }
let db = FMDatabase(path: "/Users/luosu/Downloads/11資料/09實(shí)用技術(shù)學(xué)習(xí)/練習(xí)/sql/fmdb.sqlite")
//打開數(shù)據(jù)庫(kù)
if db.open()
{
print("數(shù)據(jù)庫(kù)打開成功")
}
else
{
print("創(chuàng)建表失敗")
}
- 執(zhí)行更新
在FMDB中谓松,除查詢以外的所有操作,都稱為“更新”
create践剂、drop、insert娜膘、update逊脯、delete
等
使用executeUpdate:方法執(zhí)行更新
- (BOOL)executeUpdate:(NSString*)sql, ...
- (BOOL)executeUpdateWithFormat:(NSString*)format, ...
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments
示例
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]
//swift
///插入數(shù)據(jù)
func insertRecord()
{
let sql = "insert into t_stu (name, age)values('zs', 29)"
let result = db.executeStatements(sql)
if result
{
print("插入成功")
}
else
{
print("插入失敗")
}
}
- 執(zhí)行查詢
查詢方法
- (FMResultSet *)executeQuery:(NSString*)sql, ...
- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
demo
/// 查詢所有信息
func queryAll()
{
let sql = "select * from t_stu"
var resultSet:FMResultSet?
do {
try resultSet = db.executeQuery(sql, values: nil)
} catch {
print("有異常錯(cuò)誤")
}
while resultSet!.next()
{
let name = resultSet?.string(forColumn: "name")
let age = resultSet?.int(forColumn: "age")
let score = resultSet?.double(forColumn: "score")
let id = resultSet?.int(forColumn: "id")
print(id, name, age, score)
}
}
- 關(guān)閉數(shù)據(jù)庫(kù)
database.close()
19-(掌握)FMDabaseQueue 高級(jí)使用
fmdb可以同時(shí)執(zhí)行多條語(yǔ)句
/// 同時(shí)執(zhí)行多條語(yǔ)句
func excureStatments()
{
let sql = "insert into t_stu (name, age) values('luo', 22); update t_stu set name='lili2' where name='lili'"
if db.executeStatements(sql){
print("同時(shí)執(zhí)行多條語(yǔ)句成功")
}
else
{
print("同時(shí)執(zhí)行多條語(yǔ)句失敗")
}
}
FMDatabase這個(gè)類是線程不安全的,如果在多個(gè)線程中同時(shí)使用一個(gè)FMDatabase實(shí)例竣贪,會(huì)造成數(shù)據(jù)混亂等問(wèn)題
為了保證線程安全军洼,F(xiàn)MDB提供方便快捷的FMDatabaseQueue類
使用這個(gè)類操作數(shù)據(jù)庫(kù)不需要手動(dòng)打開巩螃,直接可以調(diào)用相關(guān)的函數(shù)
FMDatabaseQueue的創(chuàng)建
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
簡(jiǎn)單使用
[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
// 查詢
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
}];
使用事務(wù)
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
//查詢
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
}];
//swfit
let dbQueue = FMDatabaseQueue(path: "/Users/luosu/Downloads/11資料/09實(shí)用技術(shù)學(xué)習(xí)/練習(xí)/sql/fmdb.sqlite")
func queueCreateTable(){
let sql = "create table if not exists t_stu2 (id integer primary key autoincrement, name text not null, age integer,score real default 60)"
dbQueue?.inDatabase({ db in
if db.executeStatements(sql)
{
print("queue創(chuàng)建表成功")
}else
{
print("queue創(chuàng)建表失敗")
}
})
}
///插入數(shù)據(jù)
func queueInsertRecord()
{
let sql = "insert into t_stu2 (name, age)values('hanmei', 29)"
dbQueue?.inDatabase({ db in
let result = db.executeStatements(sql)
if result
{
print("queue插入成功")
}
else
{
print("que插入失敗")
}
})
}
/// 執(zhí)行事務(wù)
func trasaction()
{
let sql = "insert into t_stu2 (name, age) values('luo', 22);"
let sql2 = "insert into t_stu22 (name, age) values('lili', 32);"
dbQueue?.inTransaction({ db, rollback in
let result1 = db.executeStatements(sql)
let result2 = db.executeStatements(sql2)
if result1 && result2 {
print("事務(wù)成功完成")
}
else{
print("事務(wù)未能完成")
rollback.pointee = true
}
})
}