zoukankan      html  css  js  c++  java
  • 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("
    ");
    
        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);
  • 相关阅读:
    Java基本数据类型学习
    【异常】Docker安装elasticsearch7, 浏览使用 9200 无法打开
    docker logs-查看docker容器日志
    centos开开放防火墙
    软工超越日报-android的简单旋转效果实现 5/13
    软工超越日报-Android文件下载器 5/12
    软工超越日报-团队第一阶段冲刺十日谈回顾总结 5/11
    软工超越日报-安卓APP联网获取数据(3) 5/10
    软工超越日报-安卓APP联网获取数据(2) 5/9
    软工超越日报-安卓APP联网下载数据(1) 5/8
  • 原文地址:https://www.cnblogs.com/tang910103/p/5122108.html
Copyright © 2011-2022 走看看