FMDB的使用
目錄
1信卡、FMDB介紹
2娶聘、FMDB導(dǎo)入
3、FMDB框架中重要的框架類
3.1斥滤、FMDatabase
3.1.1将鸵、數(shù)據(jù)庫路徑
3.1.2、使用FMDataBase類執(zhí)行數(shù)據(jù)庫命令SQL
3.1.3佑颇、創(chuàng)建數(shù)據(jù)庫
3.1.4顶掉、創(chuàng)建表
3.1.5、插入指令insert
3.1.6挑胸、刪除指令delete
3.1.7痒筒、更新指令update
3.2、FMResultSet
3.2.1嗜暴、查詢指令select
3.3凸克、FMDatabaseQueue
3.3.1、使用FMDatabaseQueue類實(shí)現(xiàn)多線程操作
4數(shù)據(jù)庫相關(guān)文章
1闷沥、FMDB介紹
FMDB是一款簡潔萎战、易用的封裝庫。
因此舆逃,在這里推薦使用第三方框架FMDB蚂维,它是對libsqlite3框架的封裝,用起來的步驟與SQLite使用類似路狮,并且它對于多線程的并發(fā)操作進(jìn)行了處理虫啥,所以是線程安全的。
- 對多線程的并發(fā)操作進(jìn)行處理奄妨,所以是線程安全的涂籽。
- 以O(shè)C的方式封裝了SQLite的C語言API,使用起來更加的方便砸抛。
- FMDB是輕量級的框架评雌,使用靈活树枫。
2、FMDB導(dǎo)入
用cocoapods
導(dǎo)入
導(dǎo)入libsqlite3.0.tbd
庫
導(dǎo)入頭文件#import <FMDB/FMDB.h>
platform :ios, '8.0'
use_frameworks!
target 'FMDB-Demo' do
pod 'FMDB'
end
3景东、FMDB框架中重要的框架類
3.1 FMDatabase:
FMDatabase對象就代表一個單獨(dú)的SQLite數(shù)據(jù)庫砂轻,用來執(zhí)行SQL語句。3.2 FMResultSet:
使用FMDatabase執(zhí)行查詢后的結(jié)果集斤吐。3.3 FMDatabaseQueue:
用于在多線程中執(zhí)行多個查詢或更新搔涝,它是線程安全的。
3.1.1和措、數(shù)據(jù)庫路徑
創(chuàng)建FMDatabase對象時參數(shù)為SQLite數(shù)據(jù)庫文件路徑庄呈。
- 文件路徑。該文件路徑無需真實(shí)存在派阱,如果不存在會自動創(chuàng)建抒痒。
- 空字符串
@""
。表示會在臨時目錄創(chuàng)建一個空的數(shù)據(jù)庫颁褂,當(dāng)FMDatabase連接關(guān)閉時,文件也會被刪除傀广。 - NULL颁独。將創(chuàng)建一個內(nèi)在數(shù)據(jù)庫,同樣的伪冰,當(dāng)FMDatabase連接關(guān)閉時誓酒,數(shù)據(jù)將會被銷毀
NSString *lidDirPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSString *databasePath = [lidDirPath stringByAppendingPathComponent:@"DatabaseDemo.sqlite"];
3.1.2、使用FMDataBase類執(zhí)行數(shù)據(jù)庫命令SQL
executeUpdate:
一切不是SELECT
命令的命令都視為更新贮聂。這包括
CREAT靠柑,UPDATE,INSERT吓懈,ALTER,BEGIN耻警,COMMIT隔嫡,DETACH,DELETE甘穿,DROP腮恩,END,EXPLAIN温兼,VACUUM秸滴,REPLACE等。
executeQuery:
SELECT開頭的命令
執(zhí)行更新返回一個BOOL值募判。YES表示執(zhí)行成功荡含,No則表示有錯誤咒唆。
你可以調(diào)用-lastErrorMessage和-lastErrorCode方法來得到更多信息。
注意:執(zhí)行語句不區(qū)分大小寫内颗。
3.1.3钧排、創(chuàng)建數(shù)據(jù)庫
// 根據(jù)指定的沙盒路徑來創(chuàng)建數(shù)據(jù)對象,如果路徑下的數(shù)據(jù)庫不存在均澳,就創(chuàng)建恨溜,如果存在就不創(chuàng)建
self.database = [FMDatabase databaseWithPath:databasePath];
if (self.database != nil) {
NSLog(@"數(shù)據(jù)庫創(chuàng)建成功!");
} else {
NSLog(@"數(shù)據(jù)庫創(chuàng)建失敗!");
}
3.1.4、創(chuàng)建表
// 所有的數(shù)據(jù)庫SQL語句找前,都需要數(shù)據(jù)庫打開之后才能操作
if ([self.database open]) {
NSString *createTableSql = @"create table if not exists User(id integer primary key autoincrement, username text not null, phone text not null, age integer)";
BOOL result = [self.database executeUpdate:createTableSql];
if (result) {
NSLog(@"創(chuàng)建表成功");
} else {
NSLog(@"創(chuàng)建表失敗");
}
// 每次執(zhí)行完對應(yīng)SQL之后糟袁,要關(guān)閉數(shù)據(jù)庫
[self.database close];
}
創(chuàng)建成功后能在沙盒路徑文件夾下看到.sqlite文件
3.1.5、插入指令insert
if ([self.database open]) {
NSString *insertSql = @"insert into User(username, phone, age) values(?, ?, ?)";
BOOL result = [self.database executeUpdate:insertSql, @"user01", @"110", @(18)];
if (result) {
NSLog(@"插入數(shù)據(jù)成功");
} else {
NSLog(@"插入數(shù)據(jù)失敗");
}
[self.database close];
}
可以看到數(shù)據(jù)庫插入了一條數(shù)據(jù)
3.1.6躺盛、刪除指令delete
if ([self.database open]) {
NSString *deleteSql = @"delete from User where username = ?";
BOOL result = [self.database executeUpdate:deleteSql, @"user01"];
if (result) {
NSLog(@"刪除數(shù)據(jù)成功");
} else {
NSLog(@"刪除數(shù)據(jù)失敗");
}
[self.database close];
}
可以看到數(shù)據(jù)庫對應(yīng)數(shù)據(jù)被刪除了
3.1.7项戴、更新指令update
if ([self.database open]) {
NSString *updateSql = @"update User set phone = ? where username = ?";
BOOL result = [self.database executeUpdate:updateSql, @"15823456789", @"user01"];
if (result) {
NSLog(@"更新數(shù)據(jù)成功");
} else {
NSLog(@"更新數(shù)據(jù)失敗");
}
[self.database close];
}
可以看到數(shù)據(jù)庫對應(yīng)數(shù)據(jù)更新了數(shù)據(jù)
3.2.1、查詢指令select
if ([self.database open]) {
NSString *selectSql = @"select * from User";
FMResultSet *resultSet = [self.database executeQuery:selectSql];
while ([resultSet next]) {
NSString *username = [resultSet stringForColumn:@"username"];
NSString *phone = [resultSet stringForColumn:@"phone"];
NSInteger age = [resultSet intForColumn:@"age"];
NSLog(@"username=%@, phone=%@, age=%ld \n", username, phone, age);
}
[self.database close];
}
打印結(jié)果:
2018-02-05 01:22:50.519489+0800 FMDBDemo[2960:227862] username=user01, phone=15823456789, age=18
2018-02-05 01:22:50.519661+0800 FMDBDemo[2960:227862] username=user02, phone=10086, age=20
3.3.1槽惫、使用FMDatabaseQueue類實(shí)現(xiàn)多線程操作
在多個線程中同時使用一個FMDatabase
實(shí)例是不明智的≈芏#現(xiàn)在你可以為每個線程創(chuàng)建一個FMDatabase
對象,不要讓多個線程分享同一個實(shí)例界斜,他無法在多個線程中同時使用仿耽。否則程序會時不時崩潰或者報(bào)告異常。所以各薇,不要初始化FMDatabase對象项贺,然后在多個線程中使用。這時候峭判,我們就需要使 用FMDatabaseQueue來創(chuàng)建隊(duì)列執(zhí)行事務(wù)开缎。
self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:databasePath];
// // 要執(zhí)行的SQL語句,要放在Block里執(zhí)行林螃,用inDatabase不用手動打開和關(guān)閉數(shù)據(jù)庫
[self.databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
// 創(chuàng)建表奕删,增加,刪除疗认,更新急侥,查詢 操作
}];
注意block捕捉變量,使用__block BOOL result = NO;
4侮邀、數(shù)據(jù)庫相關(guān)文章
Mac終端查看sqlite3數(shù)據(jù)庫坏怪、表數(shù)據(jù)等(含sqlite可視化工具下載)
參考文章:
FMDB的使用