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