FMDB | 實現數據的增刪改查

一:介紹

FMDB是一個輕量級的數據庫,用於將網絡資源存儲在本地。 項目中使用 ARC 仍是 MRC,對使用 FMDB 都沒有任何影響,FMDB 會在編譯項目時自動匹配。 FMDB 將 SQLite API 進行了很友好的封裝,使用起來很是方便。git

下面是對FMDB的使用總結,分享給你們,另外附一份demo供你們參考。github

源碼Demo獲取方法

關注 【網羅開發】微信公衆號,回覆【92】即可領取。 網羅天下方法,方便你我開發,更多iOS技術乾貨等待領取,全部文檔會持續更新,歡迎關注一塊兒成長!sql

二:FMDB優勢

  • 1.使用起來更加面向對象,省去了不少麻煩、冗餘的C語言代碼數據庫

  • 2.對比蘋果自帶的Core Data框架,更加輕量級和靈活安全

  • 3.提供了多線程安全的數據庫操做方法,有效地防止數據混亂bash

三:將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 刪除數據

刪除數據分爲刪除一條數據和刪除整表數據

  1. 刪除一條數據
// 刪除一條數據
- (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展菲

相關文章
相關標籤/搜索