標籤:
SQLite3是一款開源的嵌入式關係型資料庫,可移植性好、易使用、記憶體開銷小
SQLite3是無類型的,意味著可以儲存任何類型的資料到任意表的任意欄位中。比如下列的創表語句是合法的:
CREATE TABLE t_person(name, age);
為了保證可讀性,建議還是把欄位類型加上:
CREATE TABLE t_person(name text, age integer);
SQLite3常用的5種資料類型:text、integer、float、boolean、blob
在iOS中要使用SQLite3,需要添加庫檔案:libsqlite3.dylib並匯入主標頭檔,這是一個C語言的庫
建立資料庫(sqlite3_opendb)逐步執行操作(sqlite3_exec)建立資料表資料操作插入資料更新資料刪除資料查詢操作sqlite3_prepare_v2檢查sql的合法性sqlite3_step逐行擷取查詢結果sqlite3_coloum_xxx擷取對應類型的內容sqlite3_finalize釋放stmt
在Firefox中開啟sqlite3(如果沒有,選擇工具->附加組件,添加即可)建立sqlite3資料庫,Contacts,建立一個members表,欄位 id,integer,主鍵,自增;name,varchar;email,varchar,null;birthday,datetime,null。向表中添加一些資料:
二、建立Empty Appliation,添加一個HomeViewController,和一個組件libsqlite3.dylib,來支援對sqlite3的串連,關閉,增刪改查等操作。1. HomeViewController.h代碼:#import <UIKit/UIKit.h>#import "sqlite3.h"@interface HomeViewController : UIViewController{ //聲明一個sqlite3資料庫
sqlite3 *db;
}
//資料庫檔案的路徑。一般在沙箱的Documents裡邊操作 - (NSString *)filePath;
@end 2. HomeViewController.m代碼: #import "HomeViewController.h"@interface HomeViewController ()@end@implementation HomeViewController//該方法用於返回資料庫在Documents檔案夾中的全路徑資訊 - (NSString *)filePath{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDir = [paths objectAtIndex:0]; return [documentsDir stringByAppendingPathComponent:@"Contacts.sqlite"];}//開啟資料庫的方法 - (void)openDB{ if (sqlite3_open([[self filePath] UTF8String], &db) != SQLITE_OK) { sqlite3_close(db); NSAssert(0, @"資料庫開啟失敗。"); }}//插入資料方法- (void)insertRecordIntoTableName:(NSString *)tableName withField1:(NSString *)field1 field1Value:(NSString *)field1Value andField2:(NSString *)field2 field2Value:(NSString *)field2Value andField3:(NSString *)field3 field3Value:(NSString *)field3Value{/*方法1:經典方法 NSString *sql = [NSString stringWithFormat:@"INSERT INTO ‘%@‘ (‘%@‘, ‘%@‘, ‘%@‘) VALUES(‘%@‘, ‘%@‘, ‘%@‘)", tableName, field1, field2, field3, field1Value, field2Value, field3Value]; char *err; if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) { sqlite3_close(db); NSAssert(0, @"插入資料錯誤!"); } */ //方法2:變數的Binder 方法 //插入那張表,表中有哪些欄位,以及給出的表欄位值 NSString *sql = [NSString stringWithFormat:@"INSERT INTO ‘%@‘ (‘%@‘, ‘%@‘, ‘%@‘) VALUES (?, ?, ?)",tableName, field1, field2, field3]; sqlite3_stmt *statement; if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { sqlite3_bind_text(statement, 1, [field1Value UTF8String], -1,NULL); sqlite3_bind_text(statement, 2, [field2Value UTF8String], -1,NULL); sqlite3_bind_text(statement, 3, [field3Value UTF8String], -1,NULL); } if (sqlite3_step(statement) != SQLITE_DONE) { NSAssert(0, @"插入資料失敗!"); sqlite3_finalize(statement); } } //查詢資料- (void)getAllContacts{ NSString *sql = @"SELECT * FROM members"; sqlite3_stmt *statement; if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_ROW) { char *name = (char *)sqlite3_column_text(statement, 0); NSString *nameStr = [[NSString alloc] initWithUTF8String:name]; char *email = (char *)sqlite3_column_text(statement, 1); NSString *emailStr = [[NSString alloc] initWithUTF8String:email]; char *birthday = (char *)sqlite3_column_text(statement, 2); NSString *birthdayStr = [[NSString alloc] initWithUTF8String:birthday]; NSString *info = [[NSString alloc] initWithFormat:@"%@ - %@ - %@", nameStr, emailStr, birthdayStr]; NSLog(info); [nameStr release]; [emailStr release]; [birthdayStr release]; [info release]; } sqlite3_finalize(statement); }}- (void)viewDidLoad{ [self openDB]; [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李1" andField2:@"email" field2Value:@"[email protected]" andField3:@"birthday" field3Value:@"12-45-78"]; [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李2" andField2:@"email" field2Value:@"[email protected]" andField3:@"birthday" field3Value:@"12-45-78"]; [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李3" andField2:@"email" field2Value:@"[email protected]" andField3:@"birthday" field3Value:@"12-45-78"]; [self getAllContacts]; sqlite3_close(db); [super viewDidLoad];}@end插入資料後的效果:
查詢的效果:
三、小結:
1.資料查詢:sqlite3_exec()函數執行sql語句,在沒有傳回值的情況下(比如建立表格、插入記錄、刪除記錄等操作中)很好用。
也會用到sqlite3_stat結構、sqlite3_prepare_v2()函數、sqlte3_step()函數和sqlite3_finalize()函數。
查詢分三個階段:準備階段:sqlite3_stat、sqlite3_prepare_v2()
執行階段:sqlte3_step()
終止階段: sqlite3_finalize()
2.附表:
iOS開發之SQLite3