一個輕量級的關係型數據庫,SQLite
不區分大小寫,可是也有注意的地方,GLOB
和glob
具備不一樣做用。另外有5中基本數據類型text、integer、real、boolean、blob
git
SQLite的使用方法github
libsqlite3.tbd
的依賴庫#improt<sqlite3.h>
頭文件FMDB是iOS平臺的SQLite
數據庫框架,以OC的方式封裝了SQLite
的C語言APIsql
FMDB經常使用的三個類:
FMDataBase
:一個FMDatabase
對象就表明一個單獨的SQLite
數據庫
FMResultSet
: 使用FMDatabase
執行查詢後的結果集合
FMDatabaseQueue
: 用於多線程中執行多個查詢或更新,它是線程安全的數據庫
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];
複製代碼
FMDatabase
是線程不安全的,當FMDB數據存儲想要使用多線程的時候,FMDatabaseQueue
就可以用上了。
初始化FMDatabaseQueue
的方法與FMDatabase
相似
在初始化的時候FMDatabaseQueue
已經將打開和關閉數據庫封裝好了。因此在操做數據庫的時候不須要單獨調用FMDatabase
的open
與close
方法。
經過網上資料的查找有關其餘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數據存儲方法介紹