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], NULL, NULL, &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