1. 准备工作
iOS的SQLite使用了原生的C函数库,要使用它需要先完成下面两步:
- 为项目增加libsqlite3.dylib (总是代表最新版本的SQLite 3)
- 在需要使用SQLite API的文件中包含sqlite3.h
2. 使用步骤
2.1 打开数据库
// 声明一个sqlite3的指针变量
sqlite3 *database;
// 打开数据库文件,如果不存在则会新建
ret = sqlite3_open("/Users/DS/Desktop/db.sqlite", &database);
if (ret != SQLITE_OK) {
NSLog(@"打开数据库失败!");
}
2.2 使用数据库
2.2.1 使用sqlite3_exec()
不支持SQL语句中的占位符,访问数据集需要使用回调函数。
如果不需要访问返回的数据集,则第3、4个参数传NULL或者0
int n = 44;
char *errmsg;
char *sql = "SELECT * FROM seller;";
// 参数1:sqlite3结构体指针
// 参数2:要执行的sql语句,如果是单句,可以省略尾部分号
// 参数3:回调函数(声明形式参见callback函数),每返回一条记录会被调用一次
// 参数4:本参数会作为回调函数的第一个参数
// 参数5:返回错误描述
// 返回值:参看对应的宏声明,正确执行返回SQLITE_OK
int ret = sqlite3_exec(database, sql, &callback, &n, &errmsg);
if (ret != SQLITE_OK) {
NSLog(@"执行SQL语句失败!");
}
/**
* sqlite3返回数据集时,每一条记录都会调用一次本函数
*
* @param parameter sqlite3_exec()第四个参数传递进来的值
* @param col_count 列的数量
* @param col_value 一维数组,保存了每一列的值
* @param col_name 一维数组,保存了每一列的名称
*
* @return 如果返回0,继续查询;如果返回1,终止查询
*/
int callback(void *parameter, int col_count, char **col_value, char **col_name) {
for (int i = 0; i < col_count; i++) {
printf("%s ", col_value[i]);
}
printf("
");
return 0;
}
2.2.2 使用sqlite3_prepare_v2()
/sqlite3_step()
支持SQL语句中的占位符,访问数据集比较方便。
// 1. 使用sqlite3_open()函数打开指定的数据库文件,如果文件不存在则新建
ret = sqlite3_open([dbFilename UTF8String], &database);
if (ret != SQLITE_OK) return YES;
// 带有占位符的SQL(当然也能使用不带占位符的)
sql = "SELECT * FROM seller WHERE sex = ? AND name = ?;";
// 2. 声明一个指向sqlite3_stmt结构体的指针
sqlite3_stmt *stmt;
// 3. 对SQL语句预处理
// 参数1:sqlite3结构体指针
// 参数2:要执行的sql语句,如果是单句,可以省略尾部分号
// 参数3:要预处理的字节数(如果指定的大小超过字符串长度,则按照实际的长度计算。-1代表整个字符串)
// 参数4:返回的sqlite3_stmt结构体指针
// 参数5:指向SQL未处理部分的首地址(取决于第三个参数)
ret = sqlite3_prepare_v2(database, sql, -1, &stmt, NULL);
if (ret == SQLITE_OK) {
// 绑定参数(用于替换SQL中的占位符)
// 使用sqlite3_bind_xxx系列函数
// 第二个参数为对应占位符在整个SQL语句中的顺序值,从1开始
// 第三个参数为参数值
sqlite3_bind_int(stmt, 1, 1);
sqlite3_bind_text(stmt, 2, "skee", -1, NULL);
// 使用sqlite3_step()执行SQL语句
// 如果返回的是数据集,那么每调用一次则返回下一条记录
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 使用sqlite3_column_xxx系列函数获取一条记录中指定列的值
// 列索引从0开始
int ID = sqlite3_column_int(stmt, 0);
const unsigned char *name = sqlite3_column_text(stmt, 1);
int sex = sqlite3_column_int(stmt, 2);
printf("%d | %s | %d
", ID, name, sex);
}
}
// 4. 释放stmt
sqlite3_finalize(stmt);
// 5. 关闭数据库
sqlite3_close(database);
2.3 关闭数据库
// 关闭数据库
sqlite3_close(database);