什么是FMDB
很簡(jiǎn)單,一個(gè)iOS中SQLite API的封裝庫(kù)裕循。
其他的巴拉巴拉一大堆總結(jié)下來(lái)就是:
1.是對(duì)libsqlite3庫(kù)的封裝臣嚣,使用起來(lái)簡(jiǎn)潔、高效剥哑,沒(méi)有原來(lái)的一大堆晦澀難懂硅则、影響開(kāi)發(fā)效率的C語(yǔ)句,更加面向?qū)ο?/p>
2.非常的輕量化株婴、靈活
3.對(duì)于多線程的并發(fā)操作進(jìn)行了處理怎虫,是線程安全的(重要特性之一)
4.因?yàn)樗荗C語(yǔ)言封裝的,只能在ios開(kāi)發(fā)的時(shí)候使用督暂,所以在實(shí)現(xiàn)跨平臺(tái)操作的時(shí)候存在局限性
FMDB重要(常用)類(lèi)
FMDatabase:一個(gè)FMDatabase對(duì)象就代表一個(gè)單獨(dú)的SQLite數(shù)據(jù)庫(kù)(注意并不是表)揪垄,用來(lái)執(zhí)行SQL語(yǔ)句
FMResultSet:使用FMDatabase執(zhí)行查詢(xún)后的結(jié)果集
FMDatabaseQueue:用于在多線程中執(zhí)行多個(gè)查詢(xún)或更新,它是線程安全的
FMDB的使用步驟詳解
1.準(zhǔn)備步驟(基礎(chǔ)操作)
1.項(xiàng)目中導(dǎo)入FMDBGithub地址
Cocoapods導(dǎo)入(推薦),什么你還沒(méi)有使用Cocoapods逻翁,那么就太out了,為了不被社會(huì)所淘汰捡鱼,趕緊學(xué)起來(lái)吧唐巧-用CocoaPods做iOS程序的依賴(lài)管理/CocoaPods使用詳解
手動(dòng)下載工程八回,并導(dǎo)入
2.導(dǎo)入libsqlite3框架(一般情況下默認(rèn)是導(dǎo)入的,所以一般都不用做這一步),細(xì)心的朋友可能會(huì)發(fā)現(xiàn)我們的庫(kù)中還有一個(gè)libsqlite3.0框架驾诈,那么它們倆有什么區(qū)別呢
libsqlite3的導(dǎo)入步驟.png
3.在需要用到FMDB的控制器(或模型)地方import FMDatabase.h
FMDB的導(dǎo)入.png
4.新建一個(gè)繼承自NSObject的對(duì)象缠诅,這里我們使用student,接下來(lái)數(shù)據(jù)庫(kù)中增刪改查的對(duì)象就用stduent進(jìn)行操作示例
student對(duì)象.png
5.你已經(jīng)躍躍欲試了吧乍迄,別急管引,本地的.sqlite你現(xiàn)在還無(wú)法查看,這里非常推薦火狐瀏覽器中的插件 SQLite Manager
火狐瀏覽器插件.png
這里教大家一個(gè)快速打開(kāi)sqlite文件的小技巧闯两,在Finder中將.sqlite文件直接拖動(dòng)到SQLite Manager的打開(kāi)文件夾中褥伴,可以自動(dòng)尋址快速打開(kāi)
SQLite Manager界面.png
Finder中的.sqlite文件.png
sqlite文件打開(kāi)后的樣子.png
2.數(shù)據(jù)庫(kù)的創(chuàng)建
需要用到的全局變量(防止新手不理解代碼)
//1.獲取數(shù)據(jù)庫(kù)文件的路徑_docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];NSLog(@"%@",_docPath);mark_student =1;//設(shè)置數(shù)據(jù)庫(kù)名稱(chēng)NSString*fileName = [_docPath stringByAppendingPathComponent:@"student.sqlite"];//2.獲取數(shù)據(jù)庫(kù)_db = [FMDatabase databaseWithPath:fileName];if([_db open]) {NSLog(@"打開(kāi)數(shù)據(jù)庫(kù)成功");}else{NSLog(@"打開(kāi)數(shù)據(jù)庫(kù)失敗");}
這里我們可以打開(kāi)_docPath的路徑谅将,可以看到名為“student.sqlite”的數(shù)據(jù)庫(kù)已經(jīng)創(chuàng)建了
student.sqlite
3.表的創(chuàng)建
//3.創(chuàng)建表BOOLresult = [_db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL, sex text NOT NULL);"];if(result) {NSLog(@"創(chuàng)建表成功");}else{NSLog(@"創(chuàng)建表失敗");}
使用火狐瀏覽器的SQLite Manager插件打開(kāi)student.sqlite可以看到t_student表已經(jīng)被創(chuàng)建
t_student表
4.添加數(shù)據(jù)
//插入數(shù)據(jù)NSString*name = [NSStringstringWithFormat:@"王子涵%@",@(mark_student)];intage = mark_student;NSString*sex =@"男";mark_student ++;//1.executeUpdate:不確定的參數(shù)用?來(lái)占位(后面參數(shù)必須是oc對(duì)象重慢,饥臂;代表語(yǔ)句結(jié)束)BOOLresult = [_db executeUpdate:@"INSERT INTO t_student (name, age, sex) VALUES (?,?,?)",name,@(age),sex];//2.executeUpdateWithForamat:不確定的參數(shù)用%@,%d等來(lái)占位 (參數(shù)為原始數(shù)據(jù)類(lèi)型似踱,執(zhí)行語(yǔ)句不區(qū)分大小寫(xiě))//? ? BOOL result = [_db executeUpdateWithFormat:@"insert into t_student (name,age, sex) values (%@,%i,%@)",name,age,sex];//3.參數(shù)是數(shù)組的使用方式//? ? BOOL result = [_db executeUpdate:@"INSERT INTO t_student(name,age,sex) VALUES? (?,?,?);" withArgumentsInArray:@[name,@(age),sex]];if(result) {NSLog(@"插入成功");}else{NSLog(@"插入失敗");}
多插入幾次后隅熙,我們可以看到t_student表中添加了多條數(shù)據(jù)
添加的數(shù)據(jù)
5.刪除數(shù)據(jù)
//1.不確定的參數(shù)用?來(lái)占位 (后面參數(shù)必須是oc對(duì)象,需要將int包裝成OC對(duì)象)intidNum =11;BOOLresult = [_db executeUpdate:@"delete from t_student where id = ?",@(idNum)];//2.不確定的參數(shù)用%@核芽,%d等來(lái)占位//BOOL result = [_db executeUpdateWithFormat:@"delete from t_student where name = %@",@"王子涵"];if(result) {NSLog(@"刪除成功");}else{NSLog(@"刪除失敗");}
6.修改數(shù)據(jù)
//修改學(xué)生的名字NSString*newName =@"李浩宇";NSString*oldName =@"王子涵2";BOOLresult = [_db executeUpdate:@"update t_student set name = ? where name = ?",newName,oldName];if(result) {NSLog(@"修改成功");}else{NSLog(@"修改失敗");}
查看sqlite囚戚,可以看到王子涵2的姓名已經(jīng)被修改了
王子涵2姓名修改為了李浩宇
7.查詢(xún)數(shù)據(jù)
//查詢(xún)整個(gè)表FMResultSet * resultSet = [_db executeQuery:@"select * from t_student"];//根據(jù)條件查詢(xún)//FMResultSet * resultSet = [_db executeQuery:@"select * from t_student where id < ?", @(4)];//遍歷結(jié)果集合while([resultSet next]) {intidNum = [resultSet intForColumn:@"id"];NSString*name = [resultSet objectForColumnName:@"name"];intage = [resultSet intForColumn:@"age"];NSString*sex = [resultSet objectForColumnName:@"sex"];NSLog(@"學(xué)號(hào):%@ 姓名:%@ 年齡:%@ 性別:%@",@(idNum),name,@(age),sex);}
執(zhí)行查詢(xún)之后控制臺(tái)的打印,可以看到打印出了目前的所有數(shù)據(jù)
執(zhí)行查詢(xún)數(shù)據(jù)后控制臺(tái)的打印結(jié)果
8.表的刪除
//如果表格存在 則銷(xiāo)毀BOOLresult = [_db executeUpdate:@"drop table if exists t_student"];if(result) {NSLog(@"刪除表成功");}else{NSLog(@"刪除表失敗");}
執(zhí)行之后轧简,刷新SQLite弯淘,可以看到t_student表已經(jīng)被刪除了
刷新SQLite