IOS存儲(1)使用sqlite3

sqlite3是純C語言的庫,咱們須要使用C語法使用它,使用過程以下:git

1:工程添加sqlite3.0.sqlite,它老是表明最新的sqlite3的庫;類中添加#import <sqlite3.h>github

2:使用sqlite3_open打開數據庫sql

3:對於無返回值的sql操做,使用sqlite3_exec函數數據庫

4:對於有返回值的查詢操做,首先使用sqlite3_prepare_v2預編譯,將SQL語句編譯爲sqlite內部一個結構體(sqlite3_stmt,該結構體中包含了將要執行的的SQL語句的信息),使用sqlite3_bind_xxx進行參數綁定,而後使用sqlite3_step依此獲得查詢結果每一行數據,經過sqlite3_column_xxx 取出數據,最後釋放句柄函數

 

打開或者建立數據庫編碼

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *dirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *dbPath = [dirPath stringByAppendingPathComponent:@"mydb.db"];
    
    NSLog(@"%@",dbPath);
    //若是有數據庫則直接打開,不然建立並打開(注意filePath是ObjC中的字符串,須要轉化爲C語言字符串類型)
    if(SQLITE_OK != sqlite3_open(dbPath.UTF8String, &_database)) {
        NSLog(@"error open");
    }
    
    //sqlite3_close(_database);
}

代碼執行後沙盒document目錄下會多出一個mydb.db文件,咱們能夠經過終端在沙盒document目錄下執行sqlite3 mydb.db 命令查看db內容lua

 

添加數據庫表spa

- (IBAction)createDBTable:(id)sender {
    const char *createSQL = "create table user(id integer primary key autoincrement,name text,gender text,address text)";
    char *error;
    if(SQLITE_OK != sqlite3_exec(_database, createSQL, NULL, NULL, &error)) {
        NSLog(@"error create");
     sqlite3_free(error); } }

 sqlite3支持如下五種格式數據:code

 NULL: 表示該值爲NULL值。orm

 INTEGER: 無符號整型值。

 REAL: 浮點值。

 TEXT: 文本字符串,存儲使用的編碼方式爲UTF-八、UTF-16BE、UTF-16LE。

 BLOB: 存儲二進制數據

在終端執行.tables和.schema user能夠查看當前數據庫擁有的表以及表結構

 

添加數據

- (IBAction)saveObj:(id)sender {
    NSString *sqlStr = [NSString stringWithFormat:@"insert into user(name,gender,address) values ('%@','%@','%@')",@"zaglitao",@"gender",@"浙江"];
    const char *saveSQL = sqlStr.UTF8String;
    
    char *error;
    if(SQLITE_OK != sqlite3_exec(_database, saveSQL, NULL, NULL, &error)) {
        NSLog(@"error create");
     sqlite3_free(error); } }

 在終端執行select * from user能夠查看添加的數據

 

修改數據

- (IBAction)changeObj:(id)sender {
    NSString *sqlStr = [NSString stringWithFormat:@"update user set name='%@',address='%@' where name='%@'",@"zanglitao",@"杭州",@"zaglitao"];
    const char *updateSQL = sqlStr.UTF8String;
    
    char *error;
    if(SQLITE_OK != sqlite3_exec(_database, updateSQL, NULL, NULL, &error)) {
        NSLog(@"error create");
     sqlite3_free(error); } }

 

刪除數據

- (IBAction)deleteObj:(id)sender {
    NSString *sqlStr = [NSString stringWithFormat:@"delete from user where name='%@'",@"zanglitao"];
    const char *deleteSQL = sqlStr.UTF8String;
    
    char *error;
    if(SQLITE_OK != sqlite3_exec(_database, deleteSQL, NULL, NULL, &error)) {
        NSLog(@"error create");
     sqlite3_free(error); } }

 

上面的4中操做除了sql語句不一樣,執行的邏輯徹底一致,咱們本身使用時能夠進行統一的封裝,其中用到的關鍵函數sqlite3_exec:

SQLITE_API int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

這個接口是最經常使用到的,幾乎除了查詢以外的 sql 命令均可以用它來操做,好比建立表,插入/更新/刪除記錄,建立/提交/回滾事務等。

注意:若是 errmsg 不爲 null,那麼當錯誤發生時, sqlite 就會爲錯誤消息分配內存,返回給調用者,調用者有責任調用 sqlite3_free 來釋放這部份內存。

事務相關的操做也可使用這個方法執行,具體語句以下:

建立事務的語句:BEGIN EXCLUSIVE TRANSACTION;

提交事務的語句:COMMIT TRANSACTION;

回滾事務的語句:ROLLBACK TRANSACTION;

 

除了上面只執行一句sql語句,不須要任何返回值的數據庫操做外,還有另外一種最經常使用的數據庫操做:讀取

- (IBAction)getObjs:(id)sender {
    const char *sql = "select * from user where name like ?";
    sqlite3_stmt *stmt;
    
    //預編譯sql語句,stmt保留了預編譯結果的引用
    int quertResult = sqlite3_prepare_v2(_database, sql, -1, &stmt, NULL);
    //預編譯成功
    if (quertResult == SQLITE_OK) {
        //參數綁定
        sqlite3_bind_text(stmt, 1, "zanglitao", -1, NULL);
        
        //sqlite3_step() has another row ready
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //取出查詢結果集
            
            //列數
            int columnCount = sqlite3_column_count(stmt);
            for (int i = 0; i < columnCount; i++) {
                const char *columnname = sqlite3_column_name(stmt, i);
                const unsigned char *columnvalue = sqlite3_column_text(stmt, i);
                
                NSLog(@"%@:%@",[NSString stringWithUTF8String:columnname],[NSString stringWithUTF8String:columnvalue]);
            }
            
        }
    }
    sqlite3_finalize(stmt);
}

2014-11-13 20:41:58.717 DataStoreDemo[1781:607] id:6

2014-11-13 20:41:58.718 DataStoreDemo[1781:607] name:zanglitao

2014-11-13 20:41:58.718 DataStoreDemo[1781:607] gender:gender

2014-11-13 20:41:58.719 DataStoreDemo[1781:607] address:杭州

 

由於sqlite3使用c語法,不如oc來得簡潔,開發中經常會對sqlite3進行封裝,固然也能夠選擇第三方優秀的庫,當前比較流行的sqlite3封裝庫是FMDB,FMDB使用十分方便,具體教程能夠查看GitHub

相關文章
相關標籤/搜索