iOS SQLite3 “增刪改查”(Objective-C)

SQLite可視化工具:SQLite Professional
SQLite Professional
新建Project,添加SQLite3庫文件
Lib
因爲是Demo,所以一切從簡,只實現最簡單的操作
首先定義一個全局的句柄

static sqlite3 * db = nil;  //設置句柄 通過句柄對數據庫進行操作

打開數據庫連接,並且創建表格

-(void)openDB{

    NSArray *test = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    /*
     directory 目錄類型 比如Documents目錄 就是NSDocumentDirectory
     domainMask 在iOS的程序中這個取NSUserDomainMask
     expandTilde YES,表示將~展開成完整路徑
     */
    NSString * fileName = [[test lastObject]stringByAppendingPathComponent:@"DB_ichampion.sqlite"];
    // lastObject 取NSSearchPathForDirectoriesInDomains數組最後一個元素

    NSLog(@"%@",fileName);
    //打開數據庫 如果沒有打開的數據庫就建立一個
    //第一個參數是數據庫的路徑 注意要轉換爲c的字符串
    if (sqlite3_open(fileName.UTF8String, &db) == SQLITE_OK) {
        NSLog(@"打開數據庫成功");
        //打開數據庫成功後建立數據庫內的表
        //操作命令的字符串
        //注意SQL語句結束處有 ; 號
        NSString * sql = @"create table if not exists Table_ichampion (id integer primary key autoincrement,name text,age intger);";
        char * err;
        sqlite3_exec(db, sql.UTF8String, NULL, NULL, &err);
        if (err) {
            NSLog(@"建表失敗 -- %s",err);
        }else{
            NSLog(@"建表成功");
        }
    }else{
        NSLog(@"打開數據庫失敗");
    }
}

運行完成以後,打印輸出SQLite文件路徑,通過路徑查找到.SQLite文件,用SQLite Professional打開
Create
可以看到表格就算新建好了
創建完表格則需要插入數據,這裏一共插入了4條記錄,但是總的來說寫法就兩大種,前面三條記錄只是SQL語句的不同

-(void)insertDB{
    char * err;

    NSString * sql = @"insert into Table_ichampion(id,name,age) values(1,'Zhan',18);";
    printf("%d",sqlite3_exec(db, sql.UTF8String, NULL, NULL, &err));

    NSString * sql1 = @"insert into Table_ichampion(id,name,age) values(3,'Michael',8);";
    sqlite3_exec(db, sql1.UTF8String, NULL, NULL, &err);

    NSString * sql2 = @"insert into Table_ichampion values(NULL,'abc',6);";
    sqlite3_exec(db, sql2.UTF8String, NULL, NULL, &err);

    NSString * tableName = @"Table_ichampion";
    NSString * Name = @"name";
    NSString * Age = @"age";
    NSString * NameValue = @"abcd";
    int AgeValue = 3;
    NSString *sql3 = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES('%d', '%@', '%d')", tableName, @"id", Name, Age, 5, NameValue, AgeValue];
    if (sqlite3_exec(db, [sql3 UTF8String], NULL, NULL, &err) != SQLITE_OK)
    {
        NSAssert(0, @"插入數據錯誤!");
    }
}

同樣,我們可以看一下運行結果
insert
接下來是數據修改,這裏選擇id爲5的記錄 name 更改爲 xyz

-(void)updateDB{
    //id爲5的記錄 name 更改爲 xyz
        NSString * sql = @"update Table_ichampion set name = 'xyz' where id = 5;";
        char * err;
        sqlite3_exec(db, sql.UTF8String, NULL, NULL, &err);
        if (err) {
            NSLog(@"修改失敗--%s",err);
        }else{
            NSLog(@"修改成功");
        }
}

修改完成
update
然後是刪除,這裏刪除 abc 這條記錄

-(void)deleteDB{
//    刪除 name = abc 的記錄
    NSString * sql = @"DELETE FROM Table_ichampion WHERE name = 'abc';";
    char * err;
    sqlite3_exec(db, sql.UTF8String, NULL, NULL, &err);
    if (err) {
        NSLog(@"刪除失敗--%s",err);
    }else{
        NSLog(@"刪除成功");
    }
}

然後直接查看,看看是否刪除了abc這條記錄,以及數據庫中數據是否如截圖所示那樣(這裏查看分整張表格查看和單條記錄查看兩種)

-(void)selectDB{
    NSString *sql = @"SELECT * FROM Table_ichampion";
    sqlite3_stmt *statement;
//    查詢整張表格
    if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {

            char *id = (char *)sqlite3_column_text(statement, 0);
            NSString *idStr = [[NSString alloc] initWithUTF8String:id];

            char *name = (char *)sqlite3_column_text(statement, 1);
            NSString *nameStr = [[NSString alloc] initWithUTF8String:name];

            char *age = (char *)sqlite3_column_text(statement, 2);
            NSString *ageStr = [[NSString alloc] initWithUTF8String:age];


            NSString *info = [[NSString alloc] initWithFormat:@"%@ - %@ - %@",
                              idStr, nameStr, ageStr];

            NSLog(@"%@",info);
        }
//     單條記錄查詢
        NSString *sql1 = @"SELECT * FROM Table_ichampion WHERE name = 'Zhan';";
        if (sqlite3_prepare_v2(db, [sql1 UTF8String], -1, &statement, nil) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {

                char *id = (char *)sqlite3_column_text(statement, 0);
                NSString *idStr = [[NSString alloc] initWithUTF8String:id];

                char *name = (char *)sqlite3_column_text(statement, 1);
                NSString *nameStr = [[NSString alloc] initWithUTF8String:name];

                char *age = (char *)sqlite3_column_text(statement, 2);
                NSString *ageStr = [[NSString alloc] initWithUTF8String:age];


                NSString *info = [[NSString alloc] initWithFormat:@"%@ - %@ - %@",
                                  idStr, nameStr, ageStr];

                NSLog(@"%@",info);
            }
        }
        sqlite3_finalize(statement);
        /*
        sqlite3_finalize
        這個過程銷燬前面被sqlite3_prepare創建的準備語句,每個準備語句都必須使用這個函數去銷燬以防止內存泄露。
        在空指針上調用這個函數沒有什麼影響,同時可以準備語句的生命週期的任一時刻調用這個函數:在語句被執行前,一次或多次調用sqlite_reset之後,或者在sqlite3_step任何調用之後不管語句是否完成執行
        sqlite3_close
        這個過程關閉前面使用sqlite3_open打開的數據庫連接,任何與這個連接相關的準備語句必須在調用這個關閉函數之前被釋放
        */
    }
}

select
可以看到少了一條記錄,並且其他記錄保持不變
最後,對比一下SQLite Professional的截圖
SQL2
最後是訪問數據庫的返回值,其中0代表沒有錯誤。我們可以用printf的方法來打印返回值,方便調試。

printf("CreateResult == %d\n",sqlite3_exec(db, sql.UTF8String, NULL, NULL, &err));
#define SQLITE_OK           0   /* Successful result */
/* beginning-of-error-codes */
#define SQLITE_ERROR        1   /* SQL error or missing database */
#define SQLITE_INTERNAL     2   /* Internal logic error in SQLite */
#define SQLITE_PERM         3   /* Access permission denied */
#define SQLITE_ABORT        4   /* Callback routine requested an abort */
#define SQLITE_BUSY         5   /* The database file is locked */
#define SQLITE_LOCKED       6   /* A table in the database is locked */
#define SQLITE_NOMEM        7   /* A malloc() failed */
#define SQLITE_READONLY     8   /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite3_interrupt()*/
#define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT     11   /* The database disk image is malformed */
#define SQLITE_NOTFOUND    12   /* Unknown opcode in sqlite3_file_control() */
#define SQLITE_FULL        13   /* Insertion failed because database is full */
#define SQLITE_CANTOPEN    14   /* Unable to open the database file */
#define SQLITE_PROTOCOL    15   /* Database lock protocol error */
#define SQLITE_EMPTY       16   /* Database is empty */
#define SQLITE_SCHEMA      17   /* The database schema changed */
#define SQLITE_TOOBIG      18   /* String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT  19   /* Abort due to constraint violation */
#define SQLITE_MISMATCH    20   /* Data type mismatch */
#define SQLITE_MISUSE      21   /* Library used incorrectly */
#define SQLITE_NOLFS       22   /* Uses OS features not supported on host */
#define SQLITE_AUTH        23   /* Authorization denied */
#define SQLITE_FORMAT      24   /* Auxiliary database format error */
#define SQLITE_RANGE       25   /* 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB      26   /* File opened that is not a database file */
#define SQLITE_NOTICE      27   /* Notifications from sqlite3_log() */
#define SQLITE_WARNING     28   /* Warnings from sqlite3_log() */
#define SQLITE_ROW         100  /* sqlite3_step() has another row ready */
#define SQLITE_DONE        101  /* sqlite3_step() has finished executing */
/* end-of-error-codes */

工程源碼http://download.csdn.net/detail/u012138272/9588703


參考資料:http://www.cnblogs.com/hanjun/archive/2012/10/29/2744573.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章