SQLite3
- SQLite3是一款開源的嵌入式關(guān)系型數(shù)據(jù)庫蛉艾,可移植性好照棋、易使用科贬、內(nèi)存開銷小
- SQLite3是無類型的泳梆,意味著你可以保存任何類型的數(shù)據(jù)到任意表的任意字段中。比如下列的創(chuàng)表語句是合法的:
create table t_person(name, age);
- 為了保證可讀性榜掌,建議還是把字段類型加上:
create table t_person(name text, age integer);
- SQLite3常用的5種數(shù)據(jù)類型:text优妙、integer、float憎账、boolean套硼、blob
在iOS中使用SQLite3,首先要添加庫文件libsqlite3.dylib和導入主頭文件sqlite3.h
創(chuàng)建胞皱、打開邪意、關(guān)閉數(shù)據(jù)庫
- 創(chuàng)建或打開數(shù)據(jù)庫
// path為:~/Documents/person.db
sqlite3 *db;
int result = sqlite3_open([path UTF8String], &db);
-
代碼解析:
- sqlite3_open()將根據(jù)文件路徑打開數(shù)據(jù)庫,如果不存在反砌,則會創(chuàng)建一個新的數(shù)據(jù)庫雾鬼。如果result等于常量SQLITE_OK,則表示成功打開數(shù)據(jù)庫
- sqlite3 *db:一個打開的數(shù)據(jù)庫實例
- 數(shù)據(jù)庫文件的路徑必須以C字符串(而非NSString)傳入
關(guān)閉數(shù)據(jù)庫:sqlite3_close(db);
執(zhí)行不返回數(shù)據(jù)的SQL語句
- 執(zhí)行創(chuàng)表語句
char *errorMsg; // 用來存儲錯誤信息
char *sql = "create table if not exists t_person(id integer primary key autoincrement, name text, age integer);";
int result = sqlite3_exec(db, sql, NULL, NULL, &errorMsg);
- 代碼解析:
- sqlite3_exec()可以執(zhí)行任何SQL語句宴树,比如創(chuàng)表策菜、更新、插入和刪除操作。但是一般不用它執(zhí)行查詢語句做入,因為它不會返回查詢到的數(shù)據(jù)
- sqlite3_exec()還可以執(zhí)行的語句:
- 開啟事務:begin transaction;
- 回滾事務:rollback;
- 提交事務:commit;
帶占位符插入數(shù)據(jù)
char *sql = "insert into t_person(name, age) values(?, ?);";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, "母雞", -1, NULL);
sqlite3_bind_int(stmt, 2, 27);
}
if (sqlite3_step(stmt) != SQLITE_DONE) {
NSLog(@"插入數(shù)據(jù)錯誤");
}
sqlite3_finalize(stmt);
- 代碼解析:
sqlite3_prepare_v2()返回值等于SQLITE_OK冒晰,說明SQL語句已經(jīng)準備成功,沒有語法問題
-
sqlite3_bind_text():大部分綁定函數(shù)都只有3個參數(shù)
- 第1個參數(shù)是sqlite3_stmt *類型
- 第2個參數(shù)指占位符的位置竟块,第一個占位符的位置是1壶运,不是0
- 第3個參數(shù)指占位符要綁定的值
- 第4個參數(shù)指在第3個參數(shù)中所傳遞數(shù)據(jù)的長度,對于C字符串浪秘,可以傳遞-1代替字符串的長度
- 第5個參數(shù)是一個可選的函數(shù)回調(diào)蒋情,一般用于在語句執(zhí)行后完成內(nèi)存清理工作
sqlite_step():執(zhí)行SQL語句,返回SQLITE_DONE代表成功執(zhí)行完畢
sqlite_finalize():銷毀sqlite3_stmt *對象
查詢數(shù)據(jù)
char *sql = "select id,name,age from t_person;";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) {
int _id = sqlite3_column_int(stmt, 0);
char *_name = (char *)sqlite3_column_text(stmt, 1);
NSString *name = [NSString stringWithUTF8String:_name];
int _age = sqlite3_column_int(stmt, 2);
NSLog(@"id=%i, name=%@, age=%i", _id, name, _age);
}
}
sqlite3_finalize(stmt);
- 代碼解析
- sqlite3_step()返回SQLITE_ROW代表遍歷到一條新記錄
- sqlite3_column_*()用于獲取每個字段對應的值耸携,第2個參數(shù)是字段的索引棵癣,從0開始