筆記-FMDB

簡介

SQLite

一個輕量級的關係型數據庫,SQLite不區分大小寫,可是也有注意的地方,GLOBglob具備不一樣做用。另外有5中基本數據類型text、integer、real、boolean、blobgit

SQLite的使用方法github

  • 加入libsqlite3.tbd的依賴庫
  • 在文件中引用#improt<sqlite3.h>頭文件
  • 打開數據庫->建立表->對數據表進行操做->關閉數據庫

FMDB

FMDB是iOS平臺的SQLite數據庫框架,以OC的方式封裝了SQLite的C語言APIsql

FMDB經常使用的三個類:
FMDataBase:一個FMDatabase對象就表明一個單獨的SQLite數據庫
FMResultSet: 使用FMDatabase執行查詢後的結果集合
FMDatabaseQueue: 用於多線程中執行多個查詢或更新,它是線程安全的數據庫

FMDB的建立和使用方法

  • 下載FMDB(GitHub),而後拖入工程中,也支持pod導入
  • 在工程中添加libsqlite3.tbd的依賴庫
  • 引入頭文件#import "FMDB.h"
  • 代碼的實現:建立庫路徑->建立數據庫->打開數據庫->建立表->對數據庫進行操做->關閉數據庫

建立庫路徑

iOS本地優化存儲的數據保存在沙盒中,而且每一個應用的沙盒是相對獨立的,每一個應用的沙盒文件結構都是相同的,以下圖所示: 數組

Documents:iTunes會備份改目錄,通常用來存儲須要持久化的數據。緩存

Library/Caches:緩存,iTunes不會備份該目錄。內存不足時會被清除,應用沒有運行時,可能會被清除。通常存儲體積大,不須要備份的非重要數據。安全

Library/Preference:iTunes會備份該目錄,能夠用來存儲一些偏好設置。bash

tmp:iTunes不會備份這個目錄,用來保存臨時數據,應用退出時會清除該目錄下的數據。多線程

建立路徑 框架

上面的方法有三個參數,說明一下:

NSDocumentDirectory: 第一個參數表明要查找哪一個文件,是一個枚舉,爲了直接找到沙盒中的Documents目錄,咱們通常用NSDocumentDirectory。

NSUserDomainMask: 也是一個枚舉,表示搜索的範圍限制於當前應用的沙盒目錄。

YES: 第三個參數是一個BOOL值,iOS中主目錄的全寫形式是/User/userName,這個參數填YES就表示全寫,填NO就是「~」,通常使用YES。

經過制定SQLite數據庫文件的路徑來建立一個FMDatabase,路徑能夠是一下幾種方式中的任何一種

  • 完整的路徑,若是路徑不存在,會自動建立。
  • 空字符串@"",會自動在緩存區建立一個空的數據庫,FMDatabase鏈接關閉時,數據庫會被自動刪除。
  • 路徑爲NULL,會在內存中建立一個數據庫,一樣的,在FMDatabase鏈接關閉時,數據庫會被自動刪除。

打開數據庫,建立表

使用open語句打開數據庫,打開成功返回YES,打開失敗返回NO

執行數據庫操做

通常狀況下,咱們最經常使用的兩個方法

db executeQuery:(NSString*)sql, ...
db executeUpdate:(NSString*)sql, ...
複製代碼
  • 更新(create、drop、insert、update、delete、alter、commit、begin、detach、explain、vacuum、replace等)
  • 執行(select

關閉數據庫

[db close];
複製代碼

FMDatabaseQueue

FMDatabase是線程不安全的,當FMDB數據存儲想要使用多線程的時候,FMDatabaseQueue就可以用上了。
初始化FMDatabaseQueue的方法與FMDatabase相似

FMDatabaseQueue打開和關閉數據庫

在初始化的時候FMDatabaseQueue已經將打開和關閉數據庫封裝好了。因此在操做數據庫的時候不須要單獨調用FMDatabaseopenclose方法。

經過網上資料的查找有關其餘API的解讀,這裏說一下

更新

- (BOOL)executeUpdate:(NSString*)sql, ...;
- (BOOL)executeUpdateWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;
- (BOOL)executeUpdate:(NSString*)sql values:(NSArray * _Nullable)values error:(NSError * _Nullable __autoreleasing *)error;
- (BOOL)executeUpdate:(NSString*)sql withParameterDictionary:(NSDictionary *)arguments;
- (BOOL)executeUpdate:(NSString*)sql withVAList: (va_list)args;
複製代碼
查詢

- (FMResultSet * _Nullable)executeQuery:(NSString*)sql, ...;
- (FMResultSet * _Nullable)executeQueryWithFormat:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2);
- (FMResultSet * _Nullable)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments;
- (FMResultSet * _Nullable)executeQuery:(NSString *)sql values:(NSArray * _Nullable)values error:(NSError * _Nullable __autoreleasing *)error;
- (FMResultSet * _Nullable)executeQuery:(NSString *)sql withParameterDictionary:(NSDictionary * _Nullable)arguments;
- (FMResultSet * _Nullable)executeQuery:(NSString *)sql withVAList:(va_list)args;
複製代碼

方法解讀:

一、若是須要插入基礎數據類型,要麼本身作一下轉換,要麼調用如下方法
- (FMResultSet * _Nullable)executeQueryWithFormat:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2);

[_dataBaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
    [db executeUpdateWithFormat:@"INSERT INTO usertable VALUES (%d, %@ , %d)", 1, @"lizhiqiang", 25];
}];


二、這個沒什麼可說的,數組參數,直接上代碼
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;

[_dataBaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
    [db executeUpdate:@"INSERT INTO usertable VALUES (?, ? , ?)" withArgumentsInArray:@[@2, @"yanghuixue", @26]];
}];


三、比方法2多了error指針參數,記錄更新失敗
- (BOOL)executeUpdate:(NSString*)sql values:(NSArray * _Nullable)values error:(NSError * _Nullable __autoreleasing *)error;


四、注意,這個mark一下,參數爲字典,寫法變了,而且插入字段必須與字典key相對應
- (BOOL)executeUpdate:(NSString*)sql withParameterDictionary:(NSDictionary *)arguments;

NSDictionary *testDict = @{
                           @"id" : @14,
                           @"name" : @"ly",
                           @"age" : @15
                           };
[_dataBaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
    [db executeUpdate:@"INSERT INTO usertable VALUES(:id, :name, :age)" withParameterDictionary:testDict];
}];


五、va_list是C語言中解決變參問題的一組宏
- (BOOL)executeUpdate:(NSString*)sql withVAList: (va_list)args;
複製代碼

批處理:能夠經過調用executeStatements方法,一次執行多個sql語句

- (BOOL)executeStatements:(NSString *)sql;
- (BOOL)executeStatements:(NSString *)sql withResultBlock:(__attribute__((noescape)) FMDBExecuteStatementsCallbackBlock _Nullable)block;

例:
NSString *creatSqlString = @"CREATE TABLE IF NOT EXISTS grouptable(id INTEGER, gcid VARCHAR(64), gcname VARCHAR(64));"
@"CREATE TABLE IF NOT EXISTS usertable(id INTEGER, name VARCHAT(1024), age INTEGER)";

[_dataBaseQueue inDatabase:^(FMDatabase *db) {
    [db executeStatements:creatSqlString];
}];
複製代碼

事務

事務(Transaction)是不可分割的一個總體操做,要麼都執行,要麼都不執行。

事務裏有回滾操做,當一個總體事務在執行的時候,中間任何一個環節出現問題,則執行回滾,而後整個事務中的全部操做將無效。

FMDatabase使用事務的方法:

FMDatabaseQueue使用事務的方法:

關於SQLite的其餘知識點的總結點擊這裏前往

參考文獻:
FMDB進階
FMDB理論和實踐
最全iOS數據存儲方法介紹

相關文章
相關標籤/搜索