1.FMDB簡介
- 1.iOS中原生的SQLite API在進行數(shù)據(jù)存儲的時候,需要使用C語言中的函數(shù),操作比較繁瑣。于是膏萧,就出現(xiàn)了一系列將SQLite API進行封裝的庫,例如FMDB、PlausibleDatabase向抢、SQLitePersistentObjects等认境。
- 2.FMDB是一款簡潔、易用的封裝庫挟鸠。因此叉信,在這里推薦使用第三方框架FMDB,它是對libsqlite3框架的封裝艘希,用起來的步驟與SQLite使用類似硼身,并且它對于多線程的并發(fā)操作進行了處理,所以線程是安全的覆享。
FMDB
- 1.FMDB是用于存儲數(shù)據(jù)的第三方框架佳遂,F(xiàn)MDB是iOS平臺的SQLite數(shù)據(jù)庫框架,F(xiàn)MDB以O(shè)C的方式封裝了SQLite的C語言API撒顿。
- 2.優(yōu)點:
- 2.1 對多線程的并發(fā)操作進行處理丑罪,所以線程安全的。
- 2.2 FMDB是面向?qū)ο蟮姆锉冢設(shè)C的方式封裝了SQLite的C語言API吩屹,使用起來更加方便,不過需要多關(guān)心數(shù)據(jù)庫操作的知識拧抖。
- 2.3 FMDB是輕量級的框架煤搜,使用靈活。
- 3.缺點:不能跨平臺使用唧席,因為它是用OC的語言進行封裝擦盾,所以只能在iOS開發(fā)的時候使用。
為什么選擇FMDB
- 1.使用CoreData需要用到模型數(shù)據(jù)的轉(zhuǎn)化淌哟,雖然操作簡單迹卢,不需要直接操作數(shù)據(jù)庫,但是绞绒,性能沒有直接使用SQLite高婶希,而SQLite使用的時候榕暇,需要使用C語言函數(shù)蓬衡,操作比較麻煩,因此需要對它進行一個封裝彤枢。但是狰晚,如果只是簡單的封裝,很有可能會忽略更多重要的細(xì)節(jié)缴啡,比如如何垂并發(fā)以及安全性等問題壁晒。
- 2.因此,推薦使用FMDB框架业栅,它是對libsqlite3框架的封裝秒咐,用起來步驟和SQLite使用類似谬晕,并且它對于多線程的同時操作一個表格時,進行了處理携取,也就是說攒钳,它是線程安全的。FMDB是一個輕量級框架雷滋,使用靈活不撑。
FMDB中重要的類
- 1.FMDatabase:一個FMDatabase對象,就代表一個單獨的SQLite數(shù)據(jù)庫晤斩,用來執(zhí)行SQL語句焕檬。
- 2.FMResultSet:使用FMDatabase執(zhí)行查詢后的結(jié)果集合。
- 3.FMDatabaseQueue:用于在多線程中執(zhí)行多個查詢或更新澳泵,保證了線程安全实愚。
FMDB使用步驟
- 1.下載FMDB文件(gitHub鏈接:http://github.com/ccgus/fmdb),并將FMDB文件夾添加到項目中(也可使用CocoaPods導(dǎo)入)
- 2.導(dǎo)入libsqlite3.0框架兔辅,導(dǎo)入頭文件FMDatabase.h
- 3.代碼實現(xiàn)爆侣,與SQLite使用步驟相似,創(chuàng)建數(shù)據(jù)庫路徑幢妄,獲取數(shù)據(jù)庫路徑兔仰,打開數(shù)據(jù)庫,然后對數(shù)據(jù)庫進行增蕉鸳、刪乎赴、該、查操作潮尝,最后關(guān)閉數(shù)據(jù)庫榕吼。
2.使用:
首先下載1?? FMDB第三方, 然后在工程里面2?? 導(dǎo)入libSqlite.tbd 依賴庫
然后:
#第三步: 引入第三方類的頭文件
#import "FMDB.h"
聲明一個FMDatabase屬性, 在工程中初始化一個該類的對象(一個對象相當(dāng)于一個數(shù)據(jù)庫), 該對象在實現(xiàn)過程中用于執(zhí)行sqlite語句
/* 聲明數(shù)據(jù)庫實例屬性 */
@property (strong,nonatomic) FMDatabase *database;```
具體實現(xiàn)打開數(shù)據(jù)庫 + 建表
import "ViewController.h"
import "FMDB.h"
@interface ViewController ()
/* 聲明數(shù)據(jù)庫實例屬性 */
@property (strong,nonatomic) FMDatabase *database;
@end
@implementation ViewController
-
(void)viewDidLoad {
[super viewDidLoad];//1.得到一個路徑
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
NSLog(@"docPath = %@",path);
//2.在path路徑下拼接一個SQLite數(shù)據(jù)庫
NSString *fileName = [path stringByAppendingPathComponent:@"/student.sqlite"];
//3.初始化FMDatabase對象(就是創(chuàng)建一個數(shù)據(jù)庫,上面對FMDatabase類的作用已經(jīng)做出解釋)
self.database = [FMDatabase databaseWithPath:fileName];
//4.打開數(shù)據(jù)庫
if ([self.database open]) {
//4.1建表
//在FMDB中,除了查詢之外勉失,所以操作都會使用"executeUpdate"這個方法
//在FMDB中羹蚣,除查詢之外的所有操作,都稱為“更新”create乱凿、drop顽素、insert、update徒蟆、delete等胁出。
BOOL result = [self.database executeUpdate:@"create table if not exists t_student (id integer PRIMARY KEY AUTOINCREMENT NOT NULL,name text NOT NULL,age text NOT NULL);"];
if (result) {
NSLog(@"建表成功");
}else{
NSLog(@"建表失敗");
}
}
}
以下是對數(shù)據(jù)的增、刪段审、改全蝶、查的操作
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self insert];
[self delete:@"jack-80"];
[self deleteAll];
[self select];
[self update:@"jack-1000"];
}
pragma mark ------------ 插入 ------------
-
(void)insert{
for (int i = 0; i < 10; i++) {
NSString *name = [NSString stringWithFormat:@"jack-%d",arc4random_uniform(100)];
//使用"?"的地方代表不確定,而且不需要寫單引號'',會自動包裝,"?"代表的對象要使用@()來包裝一下抑淫,例如:
// [self.database executeUpdate:@"insert into t_student(name,age) values (?,?);",name,@(arc4random_uniform(40))];
[self.database executeUpdateWithFormat:@"insert into t_student(name,age) values (%@,%d);",name,arc4random_uniform(40)];}
}
pragma mark ----------- 刪除 ----------
//根據(jù)字段內(nèi)容刪除
- (void)delete:(NSString *)name{
[self.database executeUpdateWithFormat:@"delete from t_student where name = %@",name];
}
//刪除表中全部內(nèi)容
- (void)deleteAll{
[self.database executeUpdate:@"delete from t_student"];
}
pragma mark ---------- 查詢 ----------
-
(void)select{
//創(chuàng)建查詢結(jié)果對象
FMResultSet *resultSet = [self.database executeQuery:@"select * from t_student"];//遍歷結(jié)果
while ([resultSet next]) {
int ID = [resultSet intForColumn:@"id"];NSString *name = [resultSet stringForColumn:@"name"]; int age = [resultSet intForColumn:@"age"]; NSLog(@"%d---%@---%d",ID,name,age);
}
}
pragma mark ------------- 修改 -------------
- (void)update:(NSString *)name{
BOOL result = [self.database executeUpdateWithFormat:@"update t_student set name = %@ where name = 'jack-38'",name];
if (result) {
NSLog(@"成功");
}else{
NSLog(@"失敗");
}
}
@end