標籤:org back ges number sel sqlite資料庫 長度 href sso
2016-11-05
資料庫簡介資料庫的作用
用來做離線資料緩衝
資料緩衝策略
plist
, 歸檔
, 喜好設定
, 沙箱檔案
, SQLite資料庫
系統提供的資料存放區方式的弊端
- 不方便操作大量的資料
- 如果要添加新的資料,必須先把舊資料全部載入到記憶體中.
- 系統提供的資料存放區方式都是
覆蓋儲存
的,新的資料會覆蓋舊的資料.
- 不方便尋找大量的資料
- 當資料量非常龐大時,要查詢其中某些資料,就非常困難.
- 比如把數組資料存放區到plist檔案中,當資料量比較大時,無論儲存還是尋找資料都相當不方便.
- 當plist檔案中的資料量非常龐大時,一次性載入到記憶體,會造成記憶體暴漲
- 當plist檔案中的資料量非常龐大時,要查詢其中的某一條資料時非常困難
SQLite 簡介
SQLite是一款輕量級資料庫
- 設計目標是嵌入式的(可以放在手機沙箱裡面的)
- 體積小,佔用資源少
- 處理速度快
- 跨平台
官方網站:http://www.sqlite.org/
用戶端的資料庫 : SQLite
伺服器端的資料庫 : MySQL
, SQLServer
, Oracle
這裡示範Xcode原生SQLite的演練
建立資料庫和表使用準備
- 匯入標頭檔
"#import <sqlite3.h>"
- 新增類庫
libsqlite3.0.tbd
使用步驟
1.準備資料庫儲存的路徑2.建立資料庫檔案並開啟3.如果建立資料庫檔案成功,就建立資料庫表4.建立資料庫表成功就可以操作資料庫 (增刪改查)
提示
sqlite3
中的函數都是以sqlite3
開頭的
建立並開啟資料庫函數 : sqlite3_open
建表和資料操作函數(查詢函數除外) : sqlite3_exec
查詢函數 : sqlite3_prepare_v2
查詢資料時會得到結果集,要查詢的資料都在結果集中,while迴圈遍曆結果集一條一條記錄取出來
函式宣告
建立資料庫檔案
/*參數1 : 資料庫的儲存路徑參數2 : 資料庫執行個體傳回值 : int*/sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>);
建立資料庫表的函數
/*參數1 : 資料庫執行個體參數2 : 要執行的SQL語句(建表)參數3 : 建表成功的回調,傳入NULL參數4 : 回調的參數,傳入NULL參數5 : 錯誤資訊*/sqlite3_exec(<#sqlite3 *#>, <#const char *sql#>, <#int (*callback)(void *, int, char **, char **)#>, <#void *#>, <#char **errmsg#>);
代碼示範
建立資料庫和表
全域的資料庫執行個體
{ sqlite3 *_db;}
建立資料庫函數sqlite3_open
1.這個函數會自動監測資料庫是否已經存在,只有資料庫不存在的時候才會去建立資料庫並開啟
2.建立和開啟資料庫成功之後,就可以建立資料庫表
/// 建立資料庫- (void)createDB{ /* 建立並開啟資料庫 這個函數會自動監測資料庫是否已經存在,只有在資料庫不存的時候才會去建立資料庫並開啟資料庫 參數1 : 資料庫的路徑 參數2 : 資料庫執行個體 傳回值 int */ // 1.資料庫路徑 NSString *SQLPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"SQL.db"]; // 2.建立並開啟資料庫的函數 int result = sqlite3_open(SQLPath.UTF8String, &_db); // 判斷資料庫是否建立開啟成功 if (result == SQLITE_OK) { NSLog(@"資料庫建立開啟成功"); /* 建表 參數1 : 資料庫執行個體 參數2 : 建表的SQL語句 參數3 : 函數執行成功的回調,不需要就寫NULL 參數4 : 回調的參數,沒有就寫NULL 參數5 : 儲存錯誤資訊 傳回值 int */ // 3.建表SQL語句 NSString *createSQL = @"create table if not exists t_person(id integer primary key,name text not null,age integer);"; // 儲存錯誤資訊 char *errmsg = NULL; sqlite3_exec(_db, createSQL.UTF8String, NULL, NULL, &errmsg); if (errmsg == nil) { NSLog(@"建表成功"); } } // 4.動作表}
資料庫的對資料的增刪查改操作新增記錄
- (void)insert{ // 新增SQL語句 NSString *insertSQL = @"insert into t_person(name,age) values(‘老王‘,21);"; // 儲存錯誤資訊 char *errmsg = NULL; sqlite3_exec(_db, insertSQL.UTF8String, NULL, NULL, &errmsg); if (errmsg == nil) { // 擷取影響的行數 int changes = sqlite3_changes(_db); NSLog(@"insert影響的行數 %d",changes); NSLog(@"新增成功"); }}
刪除記錄
- (void)delete{ // 刪除SQL語句 NSString *deleteSQL = @"delete from t_person where id = 4;"; // 儲存錯誤資訊 char *errmsg = NULL; sqlite3_exec(_db, deleteSQL.UTF8String, NULL, NULL, &errmsg); if (errmsg == nil) { // 擷取影響的行數 int changes = sqlite3_changes(_db); NSLog(@"delete影響的行數 %d",changes); NSLog(@"刪除成功"); }}
修改記錄
- 更新記錄時,如果指定的 id 不存在,不會返回錯誤
- (void)update{ // 修改SQL語句 NSString *updateSQL = @"update t_person set name = ‘李雷‘ where id = 2;"; // 儲存錯誤資訊 char *errmsg = NULL; sqlite3_exec(_db, updateSQL.UTF8String, NULL, NULL, &errmsg); if (errmsg == nil) { // 擷取影響的行數 int changes = sqlite3_changes(_db); NSLog(@"update影響的行數 %d",changes); NSLog(@"修改成功"); }}
查詢先行編譯 : 檢查SQL文法的有效性
- (void)query{ /* 執行查詢語句 參數1 : 資料庫執行個體 參數2 : 查詢語句 參數3 : 查詢語句的長度,傳入-1,讓函數自己算 參數4 : 結果集,遍曆結果集,取資料 參數5 : 一般傳入NULL 傳回值 int */ // 查詢SQL語句 NSString *querySQL = @"select name,age from t_person;"; // 結果集 sqlite3_stmt *ppStmt = NULL; // 執行查詢語句 int result = sqlite3_prepare_v2(_db, querySQL.UTF8String, -1, &ppStmt, NULL); // 先行編譯 : 檢查文法的有效性 if (result == SQLITE_OK) { NSLog(@"查詢資料失敗"); } else { NSLog(@"查詢資料失敗"); } // 釋放結果集 : 不然會記憶體泄露 sqlite3_finalize(ppStmt);}
在這裡要注意:釋放結果集 不然會記憶體流失sqlite_finalize(ppStmt);
- (void)query{ /* 執行查詢語句 參數1 : 資料庫執行個體 參數2 : 查詢語句 參數3 : 查詢語句的長度,傳入-1,讓函數自己算 參數4 : 結果集,遍曆結果集,取資料 參數5 : 一般傳入NULL 傳回值 int */ // 查詢SQL語句 NSString *querySQL = @"select name,age from t_person;"; // 結果集 sqlite3_stmt *ppStmt = NULL; // 執行查詢語句 int result = sqlite3_prepare_v2(_db, querySQL.UTF8String, -1, &ppStmt, NULL); // 先行編譯 : 檢查文法的有效性 if (result == SQLITE_OK) { // 遍曆結果集,逐條取資料,直到往下找,找不到資料為止 while (sqlite3_step(ppStmt) == SQLITE_ROW) { /* 參數1 : 結果集 參數2 : 欄位的索引,從主鍵後面開始計數 */ // 取name const unsigned char *cName = sqlite3_column_text(ppStmt, 0); NSString *ocName = [[NSString alloc] initWithCString:(const char *)cName encoding:NSUTF8StringEncoding]; // 取age int age = sqlite3_column_int(ppStmt, 1); NSLog(@"%@ -- %d",ocName,age); } } else { NSLog(@"查詢資料失敗"); } // 釋放結果集 : 不然會記憶體泄露 sqlite3_finalize(ppStmt);}
SQLite簡單操作