轉載自 http://www.cnblogs.com/wendingding/p/3870289.html html
1、簡單說明sql
在iOS中使用SQLite3,首先要添加庫文件libsqlite3.dylib和導入主頭文件。數據庫
導入頭文件,能夠使用庫中的函數(是純C語言的)dom
2、具體說明ide
新建一個項目,在項目的主界面中放四個按鈕(分別是,增長、刪除、修改、查詢)。函數
1.sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)函數的一些說明:atom
(1)做用:把一個文件名稱傳遞給他,它會自動檢測這個文件是否存在,若是不存在的話,會自動建立相應的文件(這裏爲數據庫文件,剛建立爲空)。spa
(2)參數:它的第一個參數爲文件的名稱(需轉換爲C語言的),第二個參數是數據庫的實例,sqlite3 *db;指針
說明:sqlite3是一種類型,db是數據庫的句柄,就是數據庫的象徵,若是要進行增刪改查,就得操做db這個實例。調試
(3)返回值:它的返回值爲int型的,根據函數的返回值能夠知道,打開數據庫文件是成功仍是失敗,若是返回值是SQLITE_OK則說明成功,不然爲失敗。
2.打開數據庫
實現代碼和顯示:
查看沙盒內建立的數據庫文件:
雙擊打開,查看發現打開的數據庫鏈接名稱爲students,默認爲文件名的前綴,數據庫建立成功。
3.建立表
函數說明:
參數:第一個參數爲數據庫的句柄(db),第二個參數爲sql語句,第三個參數爲回調參數,是一個指向函數的指針,若是把callback前面的*改爲^則就是一個block代碼段,第四個參數能夠寫NULL,第五個參數爲錯誤信息,用以代碼調試。
//1.打開數據庫文件(若是數據庫文件不存在,那麼該函數會自動建立數據庫文件) int result = sqlite3_open(cfileName, &db); if (result==SQLITE_OK) { //打開成功 NSLog(@"成功打開數據庫"); //2.建立表 const char *sql="CREATE TABLE IF NOT EXISTS t_students (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);"; char *errmsg=NULL; result = sqlite3_exec(db, sql, NULL, NULL, &errmsg); if (result==SQLITE_OK) { NSLog(@"創表成功"); }else { NSLog(@"創表失敗----%s",errmsg); } }else { NSLog(@"打開數據庫失敗"); }
執行後,創表成功,打開建立的表查看:
調試技巧:
if (result==SQLITE_OK) { NSLog(@"創表成功"); }else { // NSLog(@"創表失敗----%s",errmsg); printf("創表失敗---%s----%s---%d",errmsg,__FILE__,__LINE__); }
__FILE__宏打印文件名,
__LINE__宏打印行號。
4.插入數據
實現代碼:
- (IBAction)insert { for (int i=0; i<20; i++) { //1.拼接SQL語句 NSString *name=[NSString stringWithFormat:@"文曉--%d",arc4random_uniform(100)]; int age=arc4random_uniform(20)+10; NSString *sql=[NSString stringWithFormat:@"INSERT INTO t_students (name,age) VALUES ('%@',%d);",name,age]; //2.執行SQL語句 char *errmsg=NULL; sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &errmsg); if (errmsg) {//若是有錯誤信息 NSLog(@"插入數據失敗--%s",errmsg); }else { NSLog(@"插入數據成功"); } } }
打印查看:
查看數據庫裏t_students表中的數據:
5.選擇(select)查詢操做
函數說明:
select操做也能夠使用sqlite3_exec函數實現,但一般使用下面的函數。
參數:第一個參數爲數據庫的句柄,第二個參數爲sql語句,第三個參數爲sql的長度(若是設置爲-1,則表明系統會自動計算sql語句的長度),第四個參數用來取數據,第五個參數爲尾部通常用不上可直接寫NULL。
示例代碼:
- (IBAction)select { const char *sql="SELECT id,name,age FROM t_students WHERE age<20;"; sqlite3_stmt *stmt=NULL; //進行查詢前的準備工做 if (sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL)==SQLITE_OK) {//SQL語句沒有問題 NSLog(@"查詢語句沒有問題"); //每調用一次sqlite3_step函數,stmt就會指向下一條記錄 while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一條記錄 //取出數據 //(1)取出第0列字段的值(int類型的值) int ID=sqlite3_column_int(stmt, 0); //(2)取出第1列字段的值(text類型的值) const unsigned char *name=sqlite3_column_text(stmt, 1); //(3)取出第2列字段的值(int類型的值) int age=sqlite3_column_int(stmt, 2); // NSLog(@"%d %s %d",ID,name,age); printf("%d %s %d\n",ID,name,age); } }else { NSLog(@"查詢語句有問題"); } }
打印查看查詢結果:
3、補充
完整代碼:
YYViewController.m文件
// // YYViewController.m // 02-SQLite的應用 // #import "YYViewController.h" #import <sqlite3.h> @interface YYViewController () //db是數據庫的句柄,就是數據庫的象徵,要對數據庫進行增刪改查,就得操做這個實例 @property(nonatomic,assign)sqlite3 *db; - (IBAction)insert; - (IBAction)delete; - (IBAction)update; - (IBAction)select; @end @implementation YYViewController - (void)viewDidLoad { [super viewDidLoad]; // sqlite3 *db; //得到數據庫文件的路徑 NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *fileName=[doc stringByAppendingPathComponent:@"students.sqlite"]; //將OC字符串轉換爲c語言的字符串 const char *cfileName=fileName.UTF8String; //1.打開數據庫文件(若是數據庫文件不存在,那麼該函數會自動建立數據庫文件) int result = sqlite3_open(cfileName, &_db); if (result==SQLITE_OK) { //打開成功 NSLog(@"成功打開數據庫"); //2.建立表 const char *sql="CREATE TABLE t_students (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);"; char *errmsg=NULL; result = sqlite3_exec(self.db, sql, NULL, NULL, &errmsg); if (result==SQLITE_OK) { NSLog(@"創表成功"); }else { // NSLog(@"創表失敗----%s",errmsg); printf("創表失敗---%s----%s---%d",errmsg,__FILE__,__LINE__); } }else { NSLog(@"打開數據庫失敗"); } } - (IBAction)insert { for (int i=0; i<20; i++) { //1.拼接SQL語句 NSString *name=[NSString stringWithFormat:@"文曉--%d",arc4random_uniform(100)]; int age=arc4random_uniform(20)+10; NSString *sql=[NSString stringWithFormat:@"INSERT INTO t_students (name,age) VALUES ('%@',%d);",name,age]; //2.執行SQL語句 char *errmsg=NULL; sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &errmsg); if (errmsg) {//若是有錯誤信息 NSLog(@"插入數據失敗--%s",errmsg); }else { NSLog(@"插入數據成功"); } } } - (IBAction)delete { } - (IBAction)updata { } - (IBAction)select { const char *sql="SELECT id,name,age FROM t_students WHERE age<20;"; sqlite3_stmt *stmt=NULL; //進行查詢前的準備工做 if (sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL)==SQLITE_OK) {//SQL語句沒有問題 NSLog(@"查詢語句沒有問題"); //每調用一次sqlite3_step函數,stmt就會指向下一條記錄 while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一條記錄 //取出數據 //(1)取出第0列字段的值(int類型的值) int ID=sqlite3_column_int(stmt, 0); //(2)取出第1列字段的值(text類型的值) const unsigned char *name=sqlite3_column_text(stmt, 1); //(3)取出第2列字段的值(int類型的值) int age=sqlite3_column_int(stmt, 2); // NSLog(@"%d %s %d",ID,name,age); printf("%d %s %d\n",ID,name,age); } }else { NSLog(@"查詢語句有問題"); } } @end