SQLite:iOS中的应用

基本步骤
1. 打开数据库。

  • 利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3类型对象,后面需要借助这个对象进行其他操作。

2.执行SQL语句

  • 无返回值语句:直接通过sqlite3_exec()函数执行(例如增、删、改)
  • 有返回值语句:①语法检测:sqlite3_prepare_v2()。②取数据:sqlite3_step()。③获取数据:sqlite3_column_类型()。如此反复循环直到遍历完成。

3.关闭数据库

1. 打开数据库

SQLite的C语言函数:

// 打开数据库
int sqlite3_open(
    const char *filename, /* 数据库路径(UTF-8) */
    sqlite3 **ppDb         /* 返回的数据库句柄 */
);

(1) 作用:把一个文件名称传递给它,它会自动检测这个文件是否存在,如果不存在的话,会自动创建相应的文件(这里为数据库文件,刚创建为空)
(2) 说明:sqlite3是一种类型,db是数据库的句柄即数据库象征,如果要进行增删改查,就得操作db这个实例
(3) 返回值:int型,若返回值是SQLITE_OK则说明成功,否则失败

Objective-C实例:

// 创建唯一的数据库指针
static sqlite3 *database = nil;

// 打开数据库
- (void)openDatabaseWithName:(NSString *)dbName{

    // 如果数据库指针有值,即数据库已经被打开,那么不做任何操作
    if (db) {
        return;
    }

    // 生成沙盒文件路径
    NSString *directory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];
    NSString *filePath = [directory stringByAppendingPathComponent:dbName];

    // 打开数据库,如果数据库存在直接打开,如果数据库不存在,创建并打开
    int result = sqlite3_open(filePath.UTF8String, &database);
    if (result == SQLITE_OK) {
        NSLog(@"数据库打开成功");
    }else{
        NSLog(@"数据库打开失败");
    }
}
2. 执行SQL语句
2.1 无返回值SQL

SQLite的C语言函数:

// 执行没有返回值的SQL语句
int sqlite3_exec(
    sqlite3 *db,                                        /* 数据库句柄 */
    const char *sql,                                    /* SQL语句(UTF-8) */
    int (*callback)(void *, int, char **, char **),     /* 回调的C函数指针 */
    void *arg,                                          /* 回调函数的第一个参数 */
    char **errmsg,                                      /* 返回的错误信息 */
);

Objective-C实例:

// 适用于建表、更新、插入和删除操作
- (void)executeNonQuery:(NSString *)sql{

    if (!database) {
        return;
    }

    char *error;
    int result = sqlite3_exec(database, sql.UTF8String, NULL, NULL, &error);
    if (result == SQLITE_OK) {
        NSLog(@"SQL语句执行成功");
    }else{
        NSLog(@"SQL语句执行过程中发生错误: %s", error);
    }
}
2.2 有返回值SQL

SQLite的C语言函数:

// 检查SQL语句的合法性(查询前的准备)
int sqlite3_prepare_V2(
    sqlite3 *db,                /* 数据库句柄 */
    const char *zSql,           /* SQL语句(UTF-8) */
    int nByte,                  /* SQL语句最大长度,-1表示SQL支持的最大长度 */
    sqlite3_stmt **ppStmt,      /* 返回的查询结果 */
    const char **pzTail         /* 返回的失败信息 */
);

// 查询一行数据
int sqlite3_step(sqlite3_stmt *); /* 如果查到一行数据,就会返回SQLITE_ROW */

// 获取当前定位记录的字段名称数目
int sqlite3_column_count(sqlite3_stmt *stmt);

// 获取当前定位记录的第几个字段名称
const char *sqlite3_column_name(sqlite3_stmt *stmt, int iCol);

// 利用`stmt获得某一字段的值`
/** 获取二进制数据 */
const void * sqlite3_column_blob(sqlite3_stmt *stmt, int iCol);
/** 获取浮点型数据 */
double sqlite3_column_double(sqlite3_stmt *stmt, int iCol);
/** 获取整型数据 */
int sqlite3_column_int(sqlite3_stmt *stmt, int iCol);
/** 获取文本数据 */
const unsigned char * sqlite3_column_text(sqlite3_stmt *stmt, int iCol);

Objective-C实例:

// 执行有返回值的SQL语句
- (NSArray *)executeQuery:(NSString *)sql{

    if (!database) {
        return nil;
    }

    NSMutableArray *arr = [NSMutableArray array];
    sqlite3_stmt *stmt; // 保存查询结果

    int result = sqlite3_prepare_V2(database, sql.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        while (SQLITE_ROW == sqlite_step(stmt)){
            int columnCount = sqlite3_step(stmt);
            NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            for (int i = 0; i < columnCount; i ++){
                // 获取第i列的字段名称
                const char *name = sqlite3_column_name(stmt, i);
                // 获取第i列的字段值
                const unsigned char *value = sqlite3_column_text(stmt, i);
                // 保存进字典
                NSString *nameStr = [NSString stringWithUTF8String:name];
                NSString *valueStr = [NSString stringWithUTF8String:(const char *)value];
                dict[nameStr] = valueStr;
            }
            [array addObject:dict];
        }
        sqlite3_finalize(stmt);// 释放伴随指针
        return array;
    }
    return nil;
}
3. 关闭数据库

SQLite的C语言函数:

// 关闭数据库
int sqlite3_close(sqlite3 *db);

Objective-C实例:

- (void)closeDatabase{

    if (!database){
        return;
    }

    int result = sqlite3_close(database);
    if (result == SQLITE_OK) {
        database = nil;
        NSLog(@"数据库关闭成功");
    }else{
        NSLog(@"数据库关闭失败");
    }
}
补充
  1. Xcode中导入libsqlite3.tbd
  2. 头文件中引入sqlite3.h
参考文章
  1. iOS学习笔记16-数据库SQLite
  2. iOS开发之数据存取-SQLite3
  3. iOS开发数据库篇—SQLite常用的函数
  4. iOS开发数据库篇—SQLite的应用
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值