1. 程式人生 > >iOS開發中SQLite簡單使用(基礎用法:建立表,增、刪、改、查)

iOS開發中SQLite簡單使用(基礎用法:建立表,增、刪、改、查)

SQLite,是一款輕型的資料庫,是遵守ACID的關係型資料庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域專案。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的記憶體就夠了。它能夠支援Windows/Linux/Unix等等主流的作業系統,同時能夠跟很多程式語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC介面,同樣比起Mysql、PostgreSQL這兩款開源的世界著名資料庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生於2000年5月。 至2015年已經有15個年頭,SQLite也迎來了一個版本 SQLite 3已經發布。

iOS開發中SQLite簡單使用:

1.首先要新增庫檔案libsqlite3.tbd  

2.一般使用的時候都是自己封裝一個類然後方便使用。

建立類SQLiteManger,在SQLiteManger中匯入標頭檔案

#import <sqlite3.h>

然後建立實體類,類似於model方便使用

SQLiteModel

2.1 開啟資料庫

- (BOOL)openTheDatabase{

//獲取資料庫檔案路徑

NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/sqlite.db"

];

//初始化sqlite

_sqlite = nil;

//開啟資料庫檔案,如果檔案存在,則直接開啟,如果不存在則建立新的檔案然後開啟

int result = sqlite3_open([filePath UTF8String], &_sqlite);

if (result != SQLITE_OK) {

NSLog(@"資料庫開啟失敗!");

returnNO;

    }

NSLog(@"資料庫開啟成功!");

returnYES;

}

這裡我們把開啟資料庫的程式碼寫在一個方法裡,因為跟其他的資料庫一樣sqlite的每一個數據庫都是要先開啟資料庫才可以操作

2.2 建立表

這裡我們建立一個表名叫t_user的表   四個欄位  主鍵為userId(text型別)  ,username(text型別) ,age(integer型別) ,sex(text型別

   - (BOOL)createTable{

//1.開啟資料庫

if (![selfopenTheDatabase]) {

returnNO;

    }

//2.建立SQL語句

NSString *sqlStr = @"create table t_user(userId text primary key not null,username text,age integer,sex text)";

//3.建立表

char *error = nil;

int result = sqlite3_exec(_sqlite, [sqlStr UTF8String], NULLNULL, &error);

if (result == SQLITE_OK) {

NSLog(@"表格建立成功");

sqlite3_close(_sqlite);

returnYES;

    }

NSLog(@"表格建立失敗");

sqlite3_close(_sqlite);

returnNO;

}


2.3 插入資料

- (BOOL)insertDataWithUserId:(NSString *)userId username:(NSString *)username age:(int)age sex:(NSString *)sex{

//1.開啟資料庫

if (![selfopenTheDatabase]) {

returnNO;

    }

//2.編寫sql語句 value值需要繫結?代替

NSString *sqlStr = @"insert into t_user(userId,username,age,sex) values(?,?,?,?)";

//3.編譯sql語句

//宣告stmt

sqlite3_stmt *stmt = nil;

int result = sqlite3_prepare_v2(_sqlite, [sqlStr UTF8String], -1, &stmt, NULL);

//編譯不成功直接返回

if (result != SQLITE_OK) {

NSLog(@"編譯失敗");

returnNO;

    }

//4.繫結引數

sqlite3_bind_text(stmt, 1, [userId UTF8String], -1, NULL);

sqlite3_bind_text(stmt, 2, [username UTF8String], -1, NULL);

sqlite3_bind_int(stmt, 3, age);

sqlite3_bind_text(stmt, 4, [sex UTF8String], -1, NULL);

//5.執行sql語句

int step = sqlite3_step(stmt);

NSLog(@"返回的狀態碼是:%d  101是成功",step);

if (step == SQLITE_ERROR) {

NSLog(@"stmt執行失敗!");

//關閉資料庫

sqlite3_close(_sqlite);

returnNO;

    }elseif (step == SQLITE_CONSTRAINT){

//關閉資料庫

sqlite3_close(_sqlite);

returnNO;

    }

//關閉編譯後的stmt 關閉資料庫

sqlite3_finalize(stmt);

sqlite3_close(_sqlite);

NSLog(@"插入成功");

returnYES;

}


2.4查詢所有資料

- (NSArray *)queryData{

//1.開啟資料庫

if (![selfopenTheDatabase]) {

returnnil;

    }

//2.編寫sql語言

NSString *sqlStr = @"select * from t_user ";

//3.編譯sql語句

sqlite3_stmt *stmt = nil;

int result = sqlite3_prepare_v2(_sqlite, [sqlStr UTF8String], -1, &stmt, NULL);

if (result != SQLITE_OK) {

NSLog(@"編譯失敗!");

returnnil;

    }

//4.繫結引數

//5.執行sql sqlite3_step分步執行(單次)

int step = sqlite3_step(stmt);

if (step == SQLITE_ERROR) {

NSLog(@"執行錯誤");

returnnil;

    }

NSMutableArray *array = [NSMutableArrayarray];

//判斷執行該步後是否還有剩餘資料

while (step == SQLITE_ROW) {

SQLiteModel *model = [[SQLiteModelalloc]init];

//獲取該該條資料的詳細欄位資訊

//userId

        model.userId = [NSStringstringWithCString:(constchar *)sqlite3_column_text(stmt, 0) encoding:NSUTF8StringEncoding];

//姓名

        model.username = [NSStringstringWithCString:(constchar *)sqlite3_column_text(stmt, 1) encoding:NSUTF8StringEncoding];

//年齡

        model.age = sqlite3_column_int(stmt, 2);

//性別

        model.sex = [NSStringstringWithCString:(constchar *)sqlite3_column_text(stmt, 3) encoding:NSUTF8StringEncoding];

        [array addObject:model];

        step = sqlite3_step(stmt);

    }

//6.關閉資料庫,關閉編譯後的stmt

sqlite3_finalize(stmt);

sqlite3_close(_sqlite);

//返回資料陣列

return  array;

}


2.5根據userId更新某一條資料

- (BOOL)updateDataWithUserId:(NSString *)userId newName:(NSString *)newName newAge:(int)newAge newSex:(NSString *)newSex{

//1.開啟資料庫

if (![selfopenTheDatabase]) {

returnNO;

    }

//2.編寫sql語句 value值需要繫結?代替

NSString *sqlStr = @"update t_user set username = ?,age = ?,sex = ? where userId = ? ";

//3.編譯sql語句

//宣告stmt

sqlite3_stmt *stmt = nil;

int result = sqlite3_prepare_v2(_sqlite, [sqlStr UTF8String], -1, &stmt, NULL);

//編譯不成功直接返回

if (result != SQLITE_OK) {

NSLog(@"編譯失敗");

returnNO;

    }

//4.繫結引數

sqlite3_bind_text(stmt, 1, [newName UTF8String], -1, NULL);

sqlite3_bind_int(stmt, 2, newAge);

sqlite3_bind_text(stmt, 3, [newSex UTF8String], -1, NULL);

sqlite3_bind_text(stmt, 4, [userId UTF8String], -1, NULL);

//5.執行sql語句

int step = sqlite3_step(stmt);

if (step == SQLITE_ERROR) {

NSLog(@"stmt執行失敗!");

//關閉資料庫

sqlite3_close(_sqlite);

returnNO;

    }

//關閉資料庫關閉編譯後的stmt

sqlite3_finalize(stmt);

sqlite3_close(_sqlite);

NSLog(@"更新成功");

returnYES;

}


2.6根據userId刪除一條資料

- (BOOL)deleteDataWithUserId:(NSString *)userId{

//1.開啟資料庫

if (![selfopenTheDatabase]) {

returnNO;

    }

//2.編寫sql語句 value值需要繫結?代替

NSString *sqlStr = @"delete from t_user where userId = ? ";

//3.編譯sql語句

//宣告stmt

sqlite3_stmt *stmt = nil;

int result = sqlite3_prepare_v2(_sqlite, [sqlStr UTF8String], -1, &stmt, NULL);

//編譯不成功直接返回

if (result != SQLITE_OK) {

NSLog(@"編譯失敗");

returnNO;

    }

//4.繫結引數

sqlite3_bind_text(stmt, 1, [userId UTF8String], -1, NULL);

//5.執行sql語句

int step = sqlite3_step(stmt);

if (step == SQLITE_ERROR) {

NSLog(@"stmt執行失敗!");

//關閉資料庫

sqlite3_close(_sqlite);

returnNO;

    }

//關閉資料庫關閉編譯後的stmt

sqlite3_finalize(stmt);

sqlite3_close(_sqlite);

NSLog(@"刪除成功");

returnYES;

}


3.demo地址https://github.com/gunmm/SQLiteDemo.git