iOS開發之SQLite3

來源:互聯網
上載者:User

標籤:

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

聯繫我們

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