一:介紹
FMDB是一個輕量級的資料庫,用於將網路資源儲存在本地。 專案中使用 ARC 還是 MRC,對使用 FMDB 都沒有任何影響,FMDB 會在編譯專案時自動匹配。 FMDB 將 SQLite API 進行了很友好的封裝,使用起來非常方便。
下面是對FMDB的使用總結,分享給大家,另外附一份demo供大家參考。
原始碼Demo獲取方法
關注 【網羅開發】微信公眾號,回覆【92】便可領取。 網羅天下方法,方便你我開發,更多iOS技術乾貨等待領取,所有文件會持續更新,歡迎關注一起成長!
二:FMDB優點
-
1.使用起來更加物件導向,省去了很多麻煩、冗餘的C語言程式碼
-
2.對比蘋果自帶的Core Data框架,更加輕量級和靈活
-
3.提供了多執行緒安全的資料庫操作方法,有效地防止資料混亂
三:將FMDB第三方庫引入到專案
下載FMDB庫檔案,demo中是直接匯入專案中,可直接下載demo引用庫檔案,也可以使用CocoaPods匯入。
注意:需要 libsqlite3.dylib 依賴(具體流程 Project->TARGETS->Build Phases->Link Binary With Libraries,然後點選+號引用該動態庫)
四:FMDB主要的核心類
4.1 FMDatabase
一個FMDatabase物件就代表一個單獨的SQLite資料庫,用來執行SQL語句。
//1.獲得資料庫檔案的路徑
NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName=[doc stringByAppendingPathComponent:@"userData.sqlite"];
self.dbPath = fileName;
//2.獲得資料庫
FMDatabase *db=[FMDatabase databaseWithPath:self.dbPath];
複製程式碼
4.2 FMResultSet
使用FMResultSet執行查詢後的結果集
// 1.執行查詢語句
FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM t_userData"];
// 2.遍歷結果
while ([resultSet next]) {
NSString *nameStr = [resultSet stringForColumn:@"userName"];
[self.nameArr addObject:nameStr];
NSString *ageStr = [resultSet stringForColumn:@"userAge"];
[self.ageArr addObject:ageStr];
NSString *idStr = [resultSet stringForColumn:@"id"];
[self.idArr addObject:idStr];
}
複製程式碼
4.3 FMDatabaseQueue
FMDatabaseQueue是在多執行緒下查詢和更新資料庫用到的類
五:使用FMDB進行增刪改查
通常對資料庫的操作,我們一般稱為CURD,即對錶進行建立(Create)、更新(Update)、讀取(Read)和刪除(Delete)操作。
5.1 資料型別分析
對資料庫中儲存的每一個值都有一個型別
- NULL 這個值為空值
- INTEGER 值被標識為整數,依據值的大小可以依次被儲存1~8個位元組
- REAL 所有值都是浮動的數值
- TEXT 值為文字字串
- BLOB 值為blob資料
5.2 FMDB庫檔案使用
1.引入標頭檔案
#import "FMDB.h"
複製程式碼
2.定義屬性
@interface viewController ()
@property(nonatomic,strong)FMDatabase *db;
@property(strong,nonatomic)NSString * dbPath;
@property(strong,nonatomic)UITextField *nameTxteField;
@property(strong,nonatomic)UITextField *ageTxteField;
@end
複製程式碼
3.獲取資料庫檔案路徑
//獲得資料庫檔案的路徑
NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName=[doc stringByAppendingPathComponent:@"userData.sqlite"];
self.dbPath = fileName;
複製程式碼
4.建表
//2.獲得資料庫
FMDatabase *db=[FMDatabase databaseWithPath:self.dbPath];
//3.開啟資料庫
if ([db open]) {
//4.創表
BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_userData (id integer PRIMARY KEY AUTOINCREMENT, userName text NOT NULL, userAge text NOT NULL);"];
if (result){
NSLog(@"創表成功");
}else{
NSLog(@"創表失敗");
}
}
self.db=db;
[self insert];
複製程式碼
5.3 新增資料
//新增資料
-(void)insert{
BOOL res = [self.db executeUpdate:@"INSERT INTO t_userData (userName, userAge) VALUES (?, ?);", _nameTxteField.text, _ageTxteField.text];
if (!res) {
NSLog(@"增加資料失敗");
}else{
NSLog(@"增加資料成功");
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"新增資料成功" preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:alert animated:YES completion:nil];
[self performSelector:@selector(dismiss:) withObject:alert afterDelay:0.5];
}
}
複製程式碼
5.4 刪除資料
刪除資料分為刪除一條資料和刪除整表資料
- 刪除一條資料
// 刪除一條資料
- (void)deleteData:(NSInteger)userid{
//1.獲得資料庫檔案的路徑
NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName=[doc stringByAppendingPathComponent:@"userData.sqlite"];
//2.獲得資料庫
FMDatabase *db = [FMDatabase databaseWithPath:fileName];
if ([db open]) {
NSString *str = [NSString stringWithFormat:@"DELETE FROM t_userData WHERE id = %ld",userid];
BOOL res = [db executeUpdate:str];
if (!res) {
NSLog(@"資料刪除失敗");
[self lookData];
} else {
NSLog(@"資料刪除成功");
[self lookData];
}
[db close];
}
}
複製程式碼
2.刪除整表資料
刪除整表資料只需要將刪除一條資料的語句更換為如下語句即可
NSString *str = @"DELETE FROM t_userData";
複製程式碼
5.5 修改資料
// 更新資料
- (void)updateData {
//獲得資料庫檔案的路徑
NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName=[doc stringByAppendingPathComponent:@"userData.sqlite"];
self.dbPath = fileName;
FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath];
if ([db open]) {
NSString *sql = @"UPDATE t_userData SET userName = ? , userAge = ? WHERE id = ?";
BOOL res = [db executeUpdate:sql,_nameTxteField.text,_ageTxteField.text,_userId];
if (!res) {
NSLog(@"資料修改失敗");
} else {
NSLog(@"資料修改成功");
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"資料修改成功" preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:alert animated:YES completion:nil];
[self performSelector:@selector(dismiss:) withObject:alert afterDelay:1.0];
}
[db close];
}
}
複製程式碼
5.6 查詢資料
//查詢資料
- (void)lookData {
//1.獲得資料庫檔案的路徑
NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName=[doc stringByAppendingPathComponent:@"userData.sqlite"];
//2.獲得資料庫
FMDatabase *db=[FMDatabase databaseWithPath:fileName];
//3.開啟資料庫
if ([db open]) {
}
self.db=db;
// 1.執行查詢語句
FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM t_userData"];
// 2.遍歷結果
while ([resultSet next]) {
NSString *nameStr = [resultSet stringForColumn:@"userName"];
[self.nameArr addObject:nameStr];
NSString *ageStr = [resultSet stringForColumn:@"userAge"];
[self.ageArr addObject:ageStr];
NSString *idStr = [resultSet stringForColumn:@"id"];
[self.idArr addObject:idStr];
}
[self.myTableView reloadData];
}
複製程式碼
希望可以幫助大家,如有問題可加QQ技術交流群: 668562416
如果哪裡有什麼不對或者不足的地方,還望讀者多多提意見或建議
如需轉載請聯絡我,經過授權方可轉載,謝謝
本篇已同步到個人部落格:FBY展菲