Sqlite封裝1-基本封裝-SqliteTool
用sqlite封裝一個資料庫
LFSqliteTool基本封裝需要做的是:
公 / 私 | API操作 | 返回 |
---|---|---|
私有 | 1.開啟資料庫 | |
私有 | 2.關閉資料庫 | |
暴露 | 3.執行語句(增刪改) | 返回是否成功 |
暴露 | 4.查詢語句(查) | 返回結果集 |
匯入標頭檔案 #import "sqlite3.h"
一、私有方法開啟資料庫
和關閉資料庫
供內部呼叫
sqlite3 *ppDb = nil;
1.開啟資料庫
根據使用者名稱,拼接上路徑,來開啟資料庫。
在開啟資料庫的時候,ppDb就被賦值了,便於被後面使用。
+ (BOOL)openDB:(NSString *)uid {
NSString *dbName = @"common.sqlite";
if (uid.length != 0) {
dbName = [NSString stringWithFormat:@"%@.sqlite", uid];
}
NSString *dbPath = [kCachePath stringByAppendingPathComponent:dbName];
// 1. 建立&開啟一個資料庫
return sqlite3_open(dbPath.UTF8String, &ppDb) == SQLITE_OK;
}
2.關閉資料庫
+ (void)closeDB {
sqlite3_close(ppDb);
}
3.執行sql語句(增刪改)
傳入sql語句和使用者名稱。
+ (BOOL)deal:(NSString *)sql uid:(NSString *)uid {
// 開啟資料庫
if (![self openDB:uid]) {
NSLog(@"開啟失敗");
return NO;
}
// 2. 執行語句
BOOL result = sqlite3_exec(ppDb, sql.UTF8String, nil, nil, nil) == SQLITE_OK;
// 3. 關閉資料庫
[self closeDB];
return result;
}
4.查詢(難點)
步驟:
開啟資料庫
-
建立準備語句
- 使用
sqlite3_prepare_v2()
函式來建立準備語句,而準備語句放在該函式的第四個引數ppStmt
中,型別為sqlite3_stmt
。 -
sqlite3_stmt
型別:將一個SQL命令字串
轉換成一條prepared語句,儲存在sqlite3_stmt型別結構體中。(即sqlite3_stmt起一個轉換作用,把字串轉換成sqlite能用的。) - 每次執行sqlite函式,都要用到ppStmt。
- 使用
繫結資料(本次可以省略)
-
執行查詢
遍歷每一行,以下對每一行記錄操作:- 獲取所有列的個數
- 遍歷所有的列
- 獲取列名
- 獲取列值
- 獲取列的型別
- 根據列的型別, 使用不同的函式, 進行獲取
重置(省略)
釋放資源
返回一個可變字典(欄位 - value)
這裡忽略了繫結和重置兩個步驟。
+ (NSMutableArray <NSMutableDictionary *>*)querySql:(NSString *)sql uid:(NSString *)uid {
[self openDB:uid];
// 準備語句(預處理語句)
// 1. 建立準備語句
// 引數1: 一個已經開啟的資料庫
// 引數2: 需要中的sql
// 引數3: 引數2取出多少位元組的長度 -1 自動計算 \0
// 引數4: 準備語句
// 引數5: 通過引數3, 取出引數2的長度位元組之後, 剩下的字串
sqlite3_stmt *ppStmt = nil;
if (sqlite3_prepare_v2(ppDb, sql.UTF8String, -1, &ppStmt, nil) != SQLITE_OK) {
NSLog(@"準備語句編譯失敗");
return nil;
}
// 2. 繫結資料(省略)
// 3. 執行
// 大陣列
NSMutableArray *rowDicArray = [NSMutableArray array];
while (sqlite3_step(ppStmt) == SQLITE_ROW) {
// 一行記錄 -> 字典
// 1. 獲取所有列的個數
int columnCount = sqlite3_column_count(ppStmt);
NSMutableDictionary *rowDic = [NSMutableDictionary dictionary];
[rowDicArray addObject:rowDic];
// 2. 遍歷所有的列
for (int i = 0; i < columnCount; i++) {
// 2.1 獲取列名
const char *columnNameC = sqlite3_column_name(ppStmt, i);
NSString *columnName = [NSString stringWithUTF8String:columnNameC];
// 2.2 獲取列值
// 不同列的型別, 使用不同的函式, 進行獲取
// 2.2.1 獲取列的型別
int type = sqlite3_column_type(ppStmt, i);
// 2.2.2 根據列的型別, 使用不同的函式, 進行獲取
id value = nil;
switch (type) {
case SQLITE_INTEGER:
value = @(sqlite3_column_int(ppStmt, i));
break;
case SQLITE_FLOAT:
value = @(sqlite3_column_double(ppStmt, i));
break;
case SQLITE_BLOB:
value = CFBridgingRelease(sqlite3_column_blob(ppStmt, i));
break;
case SQLITE_NULL:
value = @"";
break;
case SQLITE3_TEXT:
value = [NSString stringWithUTF8String: (const char *)sqlite3_column_text(ppStmt, i)];
break;
default:
break;
}
[rowDic setValue:value forKey:columnName];
}
}
// 4. 重置(省略)
// 5. 釋放資源
sqlite3_finalize(ppStmt);
[self closeDB];
return rowDicArray;
}
相關文章
- sqlite封裝SQLite封裝
- 【封裝那些事】 缺失封裝封裝
- php封裝db 類連線sqlite3PHP封裝SQLite
- Android 封裝AsyncTask操作Sqlite資料庫Android封裝SQLite資料庫
- 封裝封裝
- 【封裝小技巧】is 系列方法的封裝封裝
- 【JavaScript框架封裝】公共框架的封裝JavaScript框架封裝
- C# SQLite資料庫 訪問封裝類C#SQLite資料庫封裝
- Flutter 封裝:富文字 RichText 極簡封裝Flutter封裝
- Skyline基本操作模式封裝模式封裝
- Dapper的封裝、二次封裝、官方擴充套件包封裝,以及ADO.NET原生封裝APP封裝套件
- AVPlayer封裝封裝
- ajax 封裝封裝
- 封裝OCX封裝
- 封裝介面封裝
- java封裝Java封裝
- java 封裝Java封裝
- EventBus封裝封裝
- FMDB封裝封裝
- websocket封裝Web封裝
- 5.1封裝封裝
- 09 #### 封裝封裝
- PHP 技巧 - 封裝基本的資料型別PHP封裝資料型別
- 【封裝小技巧】列表處理函式的封裝封裝函式
- Flutter MVP 封裝FlutterMVP封裝
- JavaScript 模組封裝JavaScript封裝
- JS功能封裝JS封裝
- ToolBar封裝策略封裝
- svg sprite 封裝SVG封裝
- request sdk 封裝封裝
- 09-封裝封裝
- Java(三)封裝Java封裝
- lua list 封裝封裝
- TS MQTT封裝MQQT封裝
- axios封裝iOS封裝
- 封裝axios封裝iOS
- weex 封裝actionSheetModule封裝
- 封裝xunsearch類封裝