FMDB使用介紹

最近公司要開發(fā)新項目昔馋,要使用到數(shù)據(jù)庫接校,由于以前使用的較少珊肃,所以做下知識補充。
介紹

iOS中原生的SQLite API在使用上不好用馅笙,使用時非常不便伦乔。于是,就出現(xiàn)了一系列將SQLite API進行封裝的代碼庫董习,例如FMDB烈和、PlausibleDatabase、SQLitePersistentObjects等皿淋。

FMDB的使用

注意事項 :

使用 FMDB 先要導入系統(tǒng)庫 libsqlite3.0.dylib

ARC工程添加MRC文件: -fno-objc-arc

MRC工程添加ARC文件: -fobjc-arc

如果一個工程為MRC,其中要添加ARC的文件:

選擇target - build phases - compile sources - 單擊ARC的文件將compiler flags設置為:-fobjc-arc

如果一個工程為ARC,其中要添加MRC的文件:

同樣的路徑招刹,然后單擊MRC的文件將compiler flags設置為:-fno-objc-arc

在 FMDB 中有三個重要的類:

1.FMDatabase:是一個提供 SQLite 數(shù)據(jù)庫的類恬试,用于執(zhí)行 SQL 語句。

2.FMResultSet:用在FMDatabase中執(zhí)行查詢的結果的類疯暑。

3.FMDatabaseQueue:在多線程下查詢和更新數(shù)據(jù)庫用到的類训柴。

數(shù)據(jù)庫創(chuàng)建

FMDatabase是通過一個 SQLite 數(shù)據(jù)庫文件路徑創(chuàng)建的,此路徑可以是以下三者之一:

1.一個文件的系統(tǒng)路徑妇拯。磁盤中可以不存在此文件幻馁,因為如果不存在會自動為你創(chuàng)建。

2.一個空的字符串@""越锈。會在臨時位置創(chuàng)建一個空的數(shù)據(jù)庫仗嗦,當FMDatabase連接關閉時,該數(shù)據(jù)庫會被刪除甘凭。

3.NULL稀拐。會在內存中創(chuàng)建一個數(shù)據(jù)庫,當FMDatabase連接關閉時丹弱,該數(shù)據(jù)庫會被銷毀

//引用頭文件
#import"FMDatabase.h"
#import"FMDatabaseQueue.h"
//獲取數(shù)據(jù)庫文件的路徑:
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *path = [doc stringByAppendingPathComponent:@"user.sqlite"]; self.dbPath = path;
// 建表 
- (void)createTable { 
NSLog(@"%s", __func__); 
NSFileManager *fileManager = [NSFileManager defaultManager];
 if ([fileManager fileExistsAtPath:self.dbPath] == NO) { 
// create it 
FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath]; 
if ([db open]) { 
NSString *sql = @"CREATE TABLE 'User' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , 'name' VARCHAR(30), 'password' VARCHAR(30))"; 
BOOL res = [db executeUpdate:sql]; if (!res) { NSLog(@"error when creating db table");
 } else { 
NSLog(@"success to creating db table"); 
} 
[db close]; 
} else { NSLog(@"error when open db"); } } 
}
// 插入數(shù)據(jù) 
- (void)insertData { 
NSLog(@"%s", __func__); static int idx = 1; 
FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath]; 
if ([db open]) { NSString *sql = @"insert into user (name, password) values(?, ?) ";
NSString *name = [NSString stringWithFormat:@"ZL%d", idx++]; 
BOOL res = [db executeUpdate:sql, name, @"girl"]; if (!res) { 
NSLog(@"error to insert data"); 
} else { 
NSLog(@"success to insert data"); 
ZLTestModel *model = [ZLTestModel modelWith:name id:idx];
[self.userArr addObject:model]; 
[self.tableView reloadData];
 } 
[db close]; 
} 
}
// 更新數(shù)據(jù)
- (void)updateData { NSLog(@"%s", __func__); 
FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath];
 if ([db open]) { 
NSString *sql = @"UPDATE USER SET id = ? WHERE name = ?"; 
BOOL res = [db executeUpdate:sql, @"1", @"zl"]; 
if (!res) { 
NSLog(@"error to UPDATE data"); 
} else { NSLog(@"success to UPDATE data"); [self queryData]; 
}
 [db close]; 
} 
}
// 刪除數(shù)據(jù) 
- (void)deleteData { NSLog(@"%s", __func__); FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath]; 
if ([db open]) { 
NSString *sql = @"delete from user"; BOOL res = [db executeUpdate:sql]; 
if (!res) { 
NSLog(@"error to delete db data"); 
} else { 
NSLog(@"success to delete db data"); 
[self.userArr removeAllObjects]; 
[self.tableView reloadData]; 
} 
[db close]; 
}
}
// 查詢數(shù)據(jù) 
- (void)queryData { 
NSLog(@"%s", __func__);
 FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath]; 
if ([db open]) { NSString *sql = @"select *from user"; FMResultSet *rs = [db executeQuery:sql];
 while ([rs next]) {
 int userId = [rs intForColumn:@"id"];
NSString *name = [rs stringForColumn:@"name"]; NSString *pass = [rs stringForColumn:@"password"]; NSLog(@"user id = %d, name = %@, pass = %@", userId, name, pass); 
ZLTestModel *model = [ZLTestModel modelWith:name id:userId]; 
[self.userArr addObject:model]; 
[self.tableView reloadData]; } 
[db close];
 }
 }
//multithread
- (void)multithread { 
NSLog(@"%s", __func__); FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:self.dbPath]; 
dispatch_queue_t q1 = dispatch_queue_create("queue1", NULL); 
dispatch_queue_t q2 = dispatch_queue_create("queue2", NULL); 
dispatch_async(q1, ^{ for (int i = 0; i < 100; ++i) { 
[queue inDatabase:^(FMDatabase *db) { 
NSString *sql = @"insert into user (name, password) values(?, ?) "; 
NSString *name = [NSString stringWithFormat:@"queue111 %d", i]; 
BOOL res = [db executeUpdate:sql, name, @"boy"]; 
if (!res) { 
NSLog(@"error to add db data: %@", name); 
} else { 
NSLog(@"success to add db data: %@", name); } }]; } }); dispatch_async(q2, ^{ for (int i = 0; i < 100; ++i) {
[queue inDatabase:^(FMDatabase *db) { 
NSString *sql = @"insert into user (name, password) values(?, ?) "; 
NSString *name = [NSString stringWithFormat:@"queue222 %d", i]; 
BOOL res = [db executeUpdate:sql, name, @"boy"];
 if (!res) { 
NSLog(@"error to add db data: %@", name); } else { NSLog(@"success to add db data: %@", name); } }]; } }); }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末德撬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子躲胳,更是在濱河造成了極大的恐慌蜓洪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泛鸟,死亡現(xiàn)場離奇詭異蝠咆,居然都是意外死亡踊东,警方通過查閱死者的電腦和手機北滥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闸翅,“玉大人再芋,你說我怎么就攤上這事〖峒剑” “怎么了济赎?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長记某。 經常有香客問我司训,道長,這世上最難降的妖魔是什么液南? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任壳猜,我火速辦了婚禮,結果婚禮上滑凉,老公的妹妹穿的比我還像新娘统扳。我一直安慰自己喘帚,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布咒钟。 她就那樣靜靜地躺著吹由,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朱嘴。 梳的紋絲不亂的頭發(fā)上倾鲫,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音腕够,去河邊找鬼级乍。 笑死,一個胖子當著我的面吹牛帚湘,可吹牛的內容都是我干的玫荣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼大诸,長吁一口氣:“原來是場噩夢啊……” “哼捅厂!你這毒婦竟也來了?” 一聲冷哼從身側響起资柔,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤焙贷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贿堰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辙芍,經...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年羹与,在試婚紗的時候發(fā)現(xiàn)自己被綠了故硅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纵搁,死狀恐怖吃衅,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情腾誉,我是刑警寧澤徘层,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站利职,受9級特大地震影響趣效,放射性物質發(fā)生泄漏。R本人自食惡果不足惜猪贪,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一跷敬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哮伟,春花似錦干花、人聲如沸妄帘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抡驼。三九已至,卻和暖如春肿仑,著一層夾襖步出監(jiān)牢的瞬間致盟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工尤慰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馏锡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓伟端,卻偏偏與公主長得像杯道,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子责蝠,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容

  • 優(yōu)秀的第三方庫党巾,README 也是很優(yōu)秀的,理解了 README霜医,會對使用帶來很多便利齿拂。 ARC 和 MRC 項目...
    冷漠叻葒顏閱讀 78,046評論 46 233
  • ARC 和 MRC 項目中使用 ARC 還是 MRC,對使用 FMDB 都沒有任何影響肴敛,F(xiàn)MDB 會在編譯項目時自...
    老傅_cac3閱讀 252評論 0 1
  • FMDB簡介iOS中原生的SQLite API在使用上相當不好用署海,在使用時,非常不便医男。于是砸狞,就出現(xiàn)了一系列將SQL...
    yi葉知秋閱讀 1,416評論 1 3
  • 優(yōu)秀的第三方庫,README 也是很優(yōu)秀的昨登,理解了 README趾代,會對使用帶來很多便利贯底。 ARC 和 MRC 項目...
    月上樓閣閱讀 611評論 0 0
  • 1.CoreData 1.1 CoreData概述 1)Core data 是數(shù)據(jù)持久存儲的最佳方式 2)Core...
    微春風閱讀 3,816評論 0 10