SQLite簡單操作

來源:互聯網
上載者:User

標籤: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簡單操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.