一察迟、前言
好久沒玩數據庫了立砸,很多東西不用就忘的快掖疮,近段時間剛好有用上,在此回顧總結下颗祝。本篇博文將涉及到以下知識點:
- FMDB框架的一些概述
- FMDB的基本用法
二浊闪、FMDB的一些概述
iOS開發(fā)中對數據進行本地緩存可謂家常便飯,小數據我們用plist文件或者歸檔緩存即可螺戳,即簡單又方便搁宾。但對于一些列表一樣的數據(數據量比較大)就要用到數據庫了。關于數據庫倔幼,移動開發(fā)中肯定首選sqlite3盖腿。這是一款輕微型的嵌入式數據庫,通過sql語句進行“增刪改查”等數據操作损同。只是sqlite翩腐,里面公布的api都是一些純c語言的代碼,用起來繁瑣不堪膏燃,極為痛苦栗菜。 而FMDB這個框架,就是對sqlite用oc語法進行了一層封裝蹄梢,我們到時使用數據庫時,就可以直接用面向對象的方式進行數據操作
FMDB三個主要的類:
FMDatabase – 表示一個單獨的SQLite數據庫。 用來執(zhí)行SQLite的命令禁炒。
FMResultSet – 表示FMDatabase執(zhí)行查詢后結果集
FMDatabaseQueue – 如果你想在多線程中執(zhí)行多個查詢或更新而咆,你應該使用該類。這是線程安全的幕袱。
FMDatabase執(zhí)行數據庫操作時用到的主要方法:
//能執(zhí)行插入數據暴备、刪除數據、更新數據们豌、建表刪表操作涯捻。參數:傳入要執(zhí)行的sql語句
- (BOOL)executeUpdate:(NSString*)sql, ...;
// 查詢數據時用此方法。參數:傳入要執(zhí)行的sql語句望迎。返回值:查詢后結果集
- (FMResultSet *)executeQuery:(NSString*)sql, ...;
注:其他的幾個方法不一一例舉障癌,上面兩個方法用于數據庫操作,足矣辩尊!
三涛浙、FMDB的基本用法
從上面描述我們知道:FMDatabase和FMDatabaseQueue都能執(zhí)行數據庫操作,下面分別闡述:
- ** 使用FMDatabase執(zhí)行數據庫操作**
1摄欲、首先轿亮,導入依賴庫:libsqlite3.dylib,在需要用的地方import頭文件:"FMDB.h"
2胸墙、創(chuàng)建數據庫
//獲得沙盒數據庫文件路徑我注,有這個文件直接獲得,沒有會進行創(chuàng)建
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"student.sqlite"];
// 1.創(chuàng)建數據庫實例對象迟隅,此處通過路徑創(chuàng)建
self.db = [FMDatabase databaseWithPath:path];
3但骨、打開數據庫并建表
// 打開數據庫
if ([self.db open]) {
NSLog(@"數據庫打開成功");
//創(chuàng)建一張學生表
BOOL result = [self.db executeUpdate:@"create table if not exists t_student(id integer primary key autoincrement,name text,age integer);"];
if (result) {
NSLog(@"創(chuàng)表成功!");
}
}
4玻淑、對數據庫進行增刪查改操作
(1)插入數據
- (IBAction)insert {
//插入數據
for (int i = 0; i < 20; i++) {
NSString *name = [NSString stringWithFormat:@"name%d",i];
//注:此處sql語句具體的值可以用嗽冒?替代,相當于占位符补履,后面逗號隔開后添坊,放具體的值,如此可以防止數據寫死
BOOL result =[self.db executeUpdate:@"insert into t_student (name,age) values (?,?);",name,@(i + 20)];
if (result) {
NSLog(@"插入數據成功箫锤!");
}
}
}
(2)刪除數據
- (IBAction)delete {
//刪除數據
[self.db executeUpdate:@"delete from t_student where age > ?;",@(30)];
}
(3)修改數據
- (IBAction)update {
//更新數據
BOOL result = [self.db executeUpdate:@"update t_student set name = ?;",@"夜闌珊"];
if (result) {
NSLog(@"更新數據成功贬蛙!");
}
}
(4)查詢數據
- (IBAction)select {
//返回一個FMResultSet集合,通過索引取數據谚攒,即調用其方法[set next]阳准,開始沒有指向數據,返回no馏臭,調用一次指向下條數據野蝇,當最后跳數據指向完時,返回no,下面是通過while循環(huán)遍歷數據
FMResultSet *set = [self.db executeQuery:@"select *from t_student where age > ?;",@(30)];
while (set.next) {
//通過字段名字取數據
int ID = [set intForColumn:@"id"];
NSString *name = [set stringForColumn:@"name"];
int age = [set intForColumn:@"age"];
NSLog(@"id=%d,name=%@,age=%d",ID,name,age);
}
}
- 使用FMDatabaseQueue執(zhí)行數據庫操作
上面提到過,直接使用FMDatabase線程是不安全的绕沈,在多線程進行數據庫操作的情況下建議使用FMDatabaseQueue锐想。
它執(zhí)行數據操作時,用到的核心方法是:
//block里面?zhèn)骰財祿鞂嵗鼺MDatabase *db,我們用db對象進行增刪改查操作
- (void)inDatabase:(void (^)(FMDatabase *db))block;
具體使用請看下面代碼實例:
#import "FMDB.h"
@interface ViewController ()
@property(nonatomic,strong)FMDatabaseQueue *queue;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//使用數據庫隊列操作數據乍狐,fmdb線程是不安全的赠摇,建議使用FMDatabaseQueue
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"sqlite.data"];
//里面已經創(chuàng)建了FMDdataBase實例,數據庫實例
self.queue = [FMDatabaseQueue databaseQueueWithPath:path];
//通過block浅蚪,拿到FMDatabase *db
[self.queue inDatabase:^(FMDatabase *db) {
//創(chuàng)表
BOOL result = [db executeUpdate:@"create table if not exists t_student(id integer primary key autoincrement,name text,age integer);"];
if (result) {
NSLog(@"創(chuàng)表成功");
}
}];
}
- (IBAction)insert
{ //通過block藕帜,拿到FMDatabase *db
[self.queue inDatabase:^(FMDatabase *db) {
for (int i = 0; i<40; i++) {
NSString *name = [NSString stringWithFormat:@"rose-%d", arc4random() % 1000];
NSNumber *age = @(arc4random() % 100 + 1);
[db executeUpdate:@"insert into t_student (name, age) values (?, ?);", name, age];
}
}];
}
- (IBAction)delete {
//刪除數據
[self.queue inDatabase:^(FMDatabase *db) {
[db executeUpdate::@"delete from t_student where age > ?;",@(30)];
};
}
- (IBAction)update
{
[self.queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"update t_student set age = ? where name = ?;", @20, @"jack"];
};
}
- (IBAction)query
{
[self.queue inDatabase:^(FMDatabase *db) {
// 1.查詢數據
FMResultSet *rs = [db executeQuery:@"select * from t_student where age > ?;", @50];
// 2.遍歷結果集
while (rs.next) {
int ID = [rs intForColumn:@"id"];
NSString *name = [rs stringForColumn:@"name"];
int age = [rs intForColumn:@"age"];
NSLog(@"%d %@ %d", ID, name, age);
}
}];
}
三、結語
以上是FMDB的一些非诚О粒基礎的用法洽故,非常簡單。FMDB雖然對sqlite進行了一層包裝使我們不需要直接面對那些繁瑣的c語言操漠,但是它也有一個缺陷收津,那就是我們依然需要寫那些繁瑣的sql語句,那么有沒有一種更簡便的做法讓我們直接做到對數據增刪改查而不用寫sql語句呢浊伙?答案肯定是有的撞秋,那就是對FMDB再進行一層封裝。在企業(yè)開發(fā)中也是經常這樣做的嚣鄙,封裝比較好的那就是你直接傳一個模型數據來吻贿,我內部根據你傳遞的模型數據,用runtime獲取到模型的所有字段哑子,然后拼接sql語句珠闰,進行相應地增刪查改炭序。本篇由于篇幅所限呜叫,暫時不講這個侦香,后續(xù)會陸續(xù)更新一些篇幅講解:如何封裝一個通用、簡單弥奸、易用的FMDB管理類榨惠。