FMDB數據庫操作的一些用法和總結

DATABASE

一察迟、前言

好久沒玩數據庫了立砸,很多東西不用就忘的快掖疮,近段時間剛好有用上,在此回顧總結下颗祝。本篇博文將涉及到以下知識點:

  • 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管理類榨惠。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盛霎,隨后出現的幾起案子赠橙,更是在濱河造成了極大的恐慌,老刑警劉巖愤炸,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件期揪,死亡現場離奇詭異,居然都是意外死亡规个,警方通過查閱死者的電腦和手機凤薛,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門姓建,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人枉侧,你說我怎么就攤上這事引瀑。” “怎么了榨馁?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長帜矾。 經常有香客問我翼虫,道長,這世上最難降的妖魔是什么屡萤? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任珍剑,我火速辦了婚禮,結果婚禮上死陆,老公的妹妹穿的比我還像新娘招拙。我一直安慰自己,他們只是感情好措译,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布别凤。 她就那樣靜靜地躺著,像睡著了一般领虹。 火紅的嫁衣襯著肌膚如雪规哪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天塌衰,我揣著相機與錄音诉稍,去河邊找鬼。 笑死最疆,一個胖子當著我的面吹牛杯巨,可吹牛的內容都是我干的。 我是一名探鬼主播努酸,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼服爷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚊逢?” 一聲冷哼從身側響起层扶,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烙荷,沒想到半個月后镜会,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡终抽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年戳表,在試婚紗的時候發(fā)現自己被綠了桶至。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡匾旭,死狀恐怖镣屹,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情价涝,我是刑警寧澤女蜈,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站色瘩,受9級特大地震影響伪窖,放射性物質發(fā)生泄漏。R本人自食惡果不足惜居兆,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一覆山、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泥栖,春花似錦簇宽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耙蔑,卻和暖如春见妒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背甸陌。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工须揣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钱豁。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓耻卡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牲尺。 傳聞我的和親對象是個殘疾皇子卵酪,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容