FMDB是一個輕量級的數據庫,用於將網絡資源存儲在本地。 項目中使用 ARC 仍是 MRC,對使用 FMDB 都沒有任何影響,FMDB 會在編譯項目時自動匹配。 FMDB 將 SQLite API 進行了很友好的封裝,使用起來很是方便。git
下面是對FMDB的使用總結,分享給你們,另外附一份demo供你們參考。github
關注 【網羅開發】微信公衆號,回覆【92】即可領取。 網羅天下方法,方便你我開發,更多iOS技術乾貨等待領取,全部文檔會持續更新,歡迎關注一塊兒成長!sql
1.使用起來更加面向對象,省去了不少麻煩、冗餘的C語言代碼數據庫
2.對比蘋果自帶的Core Data框架,更加輕量級和靈活安全
3.提供了多線程安全的數據庫操做方法,有效地防止數據混亂bash
下載FMDB庫文件,demo中是直接導入項目中,可直接下載demo引用庫文件,也可使用CocoaPods導入。微信
注意:須要 libsqlite3.dylib 依賴(具體流程 Project->TARGETS->Build Phases->Link Binary With Libraries,而後點擊+號引用該動態庫)網絡
一個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];
複製代碼
使用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];
}
複製代碼
FMDatabaseQueue是在多線程下查詢和更新數據庫用到的類
一般對數據庫的操做,咱們通常稱爲CURD,即對錶進行建立(Create)、更新(Update)、讀取(Read)和刪除(Delete)操做。
對數據庫中存儲的每個值都有一個類型
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];
複製代碼
//新增數據
-(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];
}
}
複製代碼
刪除數據分爲刪除一條數據和刪除整表數據
// 刪除一條數據
- (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";
複製代碼
// 更新數據
- (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];
}
}
複製代碼
//查詢數據
- (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展菲