SQLite在iOS开发中的使用

1. 准备工作

iOS的SQLite使用了原生的C函数库,要使用它需要先完成下面两步:

  1. 为项目增加libsqlite3.dylib (总是代表最新版本的SQLite 3)
  2. 在需要使用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("\n");

    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\n", ID, name, sex);
    }
}

// 4. 释放stmt
sqlite3_finalize(stmt);

// 5. 关闭数据库
sqlite3_close(database);

2.3 关闭数据库

// 关闭数据库
sqlite3_close(database);

posted on 2016-01-11 18:08  tang杰  阅读(150)  评论(0编辑  收藏  举报

导航