iOS 資料存放區之SQLite3的使用,iossqlite3

來源:互聯網
上載者:User

iOS 資料存放區之SQLite3的使用,iossqlite3

SQLite3是iOS內嵌的資料庫,SQLite3在儲存和檢索大量資料方面非常有效,它使得不必將每個對象都加到記憶體中。還能夠對資料進行負責的彙總,與使用對象執行這些操作相比,獲得結果的速度更快。

SQLite3使用SQL結構化查詢語言 (SQL),SQL是與關聯式資料庫互動的標準語言。

SQLite3的使用:

1、匯入標頭檔

#import <sqlite3.h>

2、建立或者開啟資料庫
   //建立和開啟資料庫    sqlite3 *database;        //如果sqlite3_open的結果是 SQLITE_OK,表示資料庫已經開啟成功。    //SQLite3是採用可移植的C,資料庫的檔案路徑必須以C字串(非NSString)的形式進行傳遞。    if (sqlite3_open("/path/databaseFile", &database) != SQLITE_OK) 
{
     sqlite3_close(database); NSAssert(0, @"Failed to open database");
  }
3、建立一個表
    //建立一個新表    NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS "    "(ROW INTEGER PRIMARY KEY, FIELD_DATA TEXT);";    char *errorMsg;        //sqlite3_exec 針對 SQLite3 運行任何不返回資料的命令    if (sqlite3_exec (database, [createSQL UTF8String],                      NULL, NULL, &errorMsg) != SQLITE_OK) {        sqlite3_close(database);        NSAssert(0, @"Error creating table: %s", errorMsg);    }

註:sqlite3_exec 執行之後,如果值是SQLITE_OK,則表明執行成功;否則,錯誤資訊儲存在errorMsg中。

sqlite3_exec這個方法可以執行那些沒有返回結果的操作,例如建立、插入、刪除等。

4、對錶進行操作4.1儲存資料到資料庫
      sqlite3 *database;    if (sqlite3_open([[self dataFilePath] UTF8String], &database)        != SQLITE_OK) {        sqlite3_close(database);        NSAssert(0, @"Failed to open database");    }     //例子:儲存UITextField的值到資料庫    for (int i = 0; i < 4; i++) {        UITextField *field = self.lineFields[i];                //插入操作        char *update = "INSERT OR REPLACE INTO FIELDS (ROW, FIELD_DATA) "        "VALUES (?, ?);";        char *errorMsg = NULL;        //建立stmt        sqlite3_stmt *stmt;        //無論針對哪種資料,任何綁定函數的第一個參數都指向之前在sqlite3_prepare_v2 調用中 使用的sqlite3_stmt        if (sqlite3_prepare_v2(database, update, -1, &stmt, nil)            == SQLITE_OK) {                        //SQLITE_OK 表示執行成功                        /*sqlite3_bind_int(stmt, 1, i);有三個參數:                        第一個是sqlite3_stmt類型的變數,在之前的sqlite3_prepare_v2中使用的。                        第二個是所約束變數的標籤index。                        第三個參數是要加的值。*/                        sqlite3_bind_int(stmt, 1, i);            sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL);        }                if (sqlite3_step(stmt) != SQLITE_DONE)            NSAssert(0, @"Error updating table: %s", errorMsg);                //sqlite3_finalize銷毀前面被sqlite3_prepare建立的準備語句        sqlite3_finalize(stmt);    }    //sqlite3_close關閉前面使用sqlite3_open開啟的資料庫連接,任何與這個串連相關的準備語句必須在調用這個關閉函數之前被釋放    sqlite3_close(database);
4.2 對資料庫進行查詢操作

 

    //建立query 和 sqlite3_stmt    NSString *query = @"SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW";    sqlite3_stmt *statement;        //無論針對哪種資料,任何綁定函數的第一個參數都指向之前在sqlite3_prepare_v2 調用中 使用的sqlite3_stmt    if (sqlite3_prepare_v2(database, [query UTF8String],                           -1, &statement, nil) == SQLITE_OK)    {         //sqlite3_step用於執行有前面sqlite3_prepare建立的準備語句。這個語句執行到結果的第一行可用的位置。繼續前進到結果的第二行的話,只需再次調用sqlite3_setp()。繼續調用sqlite3_setp()知道這個陳述式完成,那些不返回結果的語句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只執行一次就返回        while (sqlite3_step(statement) == SQLITE_ROW) {            int row = sqlite3_column_int(statement, 0);            char *rowData = (char *)sqlite3_column_text(statement, 1);            
NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData]; UITextField *field = self.lineFields[row]; field.text = fieldValue;
} //sqlite3_finalize銷毀前面被sqlite3_prepare建立的準備語句 sqlite3_finalize(statement); } //sqlite3_close關閉前面使用sqlite3_open開啟的資料庫連接,任何與這個串連相關的準備語句必須在調用這個關閉函數之前被釋放 sqlite3_close(database);
5、使用約束變數

實際操作時經常使用叫做約束變數的東西來構造SQL字串,從而進行插入、查詢或者刪除等。

例如,要執行帶兩個約束變數的插入操作,第一個變數是int類型,第二個是C字串:

char *sql = "insert into oneTable values (?, ?);";sqlite3_stmt *stmt;if (sqlite3_prepare_v2(database, sql, -1, &stmt, nil) == SQLITE_OK) {    sqlite3_bind_int(stmt, 1, 235);    sqlite3_bind_text(stmt, 2, "valueString", -1, NULL);}if (sqlite3_step(stmt) != SQLITE_DONE)    NSLog(@"Something is Wrong!");sqlite3_finalize(stmt);

這裡,sqlite3_bind_int(stmt, 1, 235);有三個參數:

第一個是sqlite3_stmt類型的變數,在之前的sqlite3_prepare_v2中使用的。

第二個是所約束變數的標籤index。

第三個參數是要加的值。

有一些函數多出兩個變數,例如

sqlite3_bind_text(stmt, 2, "valueString", -1, NULL);

這句,第四個參數代表第三個參數中需要傳遞的長度。對於C字串來說,-1表示傳遞全部字串。

第五個參數是一個回呼函數,比如執行後做記憶體清除工作。

 

6、SQLite3中常用的函數

sqlite3_open():開啟資料庫,在操作資料庫之前,首先要開啟資料庫。這個函數開啟一個sqlite資料庫檔案的串連並且返回一個資料庫連接對象。這個操作同時程式中的第一個調用的sqlite函數,同時也是其他sqlite api的先決條件。許多的sqlite介面函數都需要一個資料庫連接對象的指標作為它們的第一個參數。

sqlite3_prepare():將sql文本轉換成一個準備語句(prepared statement)對象,同時返回這個對象的指標。這個介面需要一個資料庫連接指標以及一個要準備的包含SQL語句的文本。它實際上並不執行(evaluate)這個SQL語句,它僅僅為執行準備這個sql語句。

sqlite3_step():執行有前面sqlite3_prepare建立的準備語句。這個語句執行到結果的第一行可用的位置。繼續前進到結果的第二行的話,只需再次調用sqlite3_setp()。繼續調用sqlite3_setp()知道這個陳述式完成,那些不返回結果的語句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只執行一次就返回。

sqlite3_column():執行sqlite3_step()執行一個準備語句得到的結果集的當前行中返回一個列。每次sqlite3_step得到一個結果集的列停下後,這個過程就可以被多次調用去查詢這個行的各列的值。對列操作是有多個函數,均以sqlite3_column為首碼。

sqlite3_finalize():銷毀前面被sqlite3_prepare建立的準備語句,每個準備語句都必須使用這個函數去銷毀以防止記憶體泄露。在null 指標上調用這個函數沒有什麼影響,同時可以準備語句的生命週期的任一時刻調用這個函數:在語句被執行前,一次或多次調用sqlite_reset之後,或者在sqlite3_step任何調用之後不管語句是否完成執行

sqlite3_close():關閉前面使用sqlite3_open開啟的資料庫連接,任何與這個串連相關的準備語句必須在調用這個關閉函數之前被釋放

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.