zoukankan      html  css  js  c++  java
  • sqlite3 简介

    1. 使用

    在iOS中操作SQLite数据库可以分为以下几步(注意先在项目中导入libsqlite3框架):

    1. 添加libsqlite3.tbd
    2. 打开数据库,利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3类型的对象,后面需要借助这个对象进行其他操作。
    3. 执行SQL语句,执行SQL语句又包括有返回值的语句和无返回值语句。
      • 对于无返回值的语句(如增加、删除、修改等)直接通过sqlite3_exec()函数执行;
      • 对于有返回值的语句则首先通过sqlite3_prepare_v2()进行sql语句评估(语法检测),然后通过sqlite3_step()依次取出查询结果的每一行数据,对于每行数据都可以通过对应的sqlite3_column_类型()方法获得对应列的数据,如此反复循环直到遍历完成。当然,最后需要释放句柄。

    在整个操作过程中无需管理数据库连接,对于嵌入式SQLite操作是持久连接(尽管可以通过sqlite3_close()关闭),不需要开发人员自己释放连接。纵观整个操作过程,其实与其他平台的开发没有明显的区别,较为麻烦的就是数据读取,在iOS平台中使用C进行数据读取采用了游标的形式,每次只能读取一行数据,较为麻烦。

    1.1 添加framework

    需要添加libsqlite3.tbd(老版本xocde中叫libsqlite3.dylib)

    1.2打开/创建数据库:

    @property (nonatomic) sqlite3 *database;
    
    ...
    
    -(BOOL)openDb:(NSString *)dbname{
    //取得数据库保存路径,通常保存沙盒Documents目录
    NSString *directory=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSLog(@"数据库db储存路径 : %@",directory);
    NSString *filePath=[directory stringByAppendingPathComponent:dbname];
    //如果有数据库则直接打开,否则创建并打开(注意filePath是ObjC中的字符串,需要转化为C语言字符串类型)
    if (SQLITE_OK ==sqlite3_open(filePath.UTF8String, &_database)) {
        NSLog(@"数据库打开成功!");
        return true;
    }else{
        NSLog(@"数据库打开失败!");
        return false;
    }
    }
    

    1.3 执行语句

    1.3.1 执行插入、修改、删除语句
    -(BOOL)executeNonQuery:(NSString *)sql{
    char *error;
    //单步执行sql语句,用于插入、修改、删除
    if (SQLITE_OK!=sqlite3_exec(_database, sql.UTF8String, NULL, NULL,&error)) {
        NSLog(@"执行SQL语句过程中发生错误!错误信息:%s",error);
        return false;
    }
    return true;
    }
    
    1.3.2 执行查询语句
    -(NSArray *)executeQuery:(NSString *)sql{
    NSMutableArray *rows=[NSMutableArray array];//数据行
    
    //评估语法正确性
    sqlite3_stmt *stmt;
    //检查语法正确性
    if (SQLITE_OK==sqlite3_prepare_v2(_database, sql.UTF8String, -1, &stmt, NULL)) {
        //单步执行sql语句
        while (SQLITE_ROW==sqlite3_step(stmt)) {
            int columnCount= sqlite3_column_count(stmt);
            NSMutableDictionary *dic=[NSMutableDictionary dictionary];
            for (int i=0; i<columnCount; i++) {
                const char *name= sqlite3_column_name(stmt, i);//取得列名
                const unsigned char *value= sqlite3_column_text(stmt, i);//取得某列的值
                dic[[NSString stringWithUTF8String:name]]=[NSString stringWithUTF8String:(const char *)value];
            }
            [rows addObject:dic];
        }
    }
    
    //释放句柄
    sqlite3_finalize(stmt);
    
    return rows;
    }
    

    2. 说明

    一些方法:

    • sqlite3 *db, 数据库句柄,跟文件句柄FILE很类似
    • sqlite3_stmt *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句
    • sqlite3_open(), 打开数据库,没有数据库时创建。
    • sqlite3_exec(), 执行非查询的sql语句
    • sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。
    • sqlite3_close(), 关闭数据库文件
    • 还有一系列的函数,用于从记录集字段中获取数据,如
      • sqlite3_column_text(), 取text类型的数据。
      • sqlite3_column_blob(),取blob类型的数据
      • sqlite3_column_int(), 取int类型的数据

    sqlite3数据库打开时的返回值及其所代表的含义:

    • SQLITE_OK=0 返回成功
    • SQLITE_FULL=13 数据库满,插入失败
    • SQLITE_ERROR=1 Sql错误或错误的数据库
    • SQLITE_CANTOPEN=14 不能打开数据库文件
    • SQLITE_INTERNAL=2 Sqlite的内部逻辑错误
    • SQLITE_PROTOCOL=15 数据库锁定协议错误
    • SQLITE_PERM=3 拒绝访问
    • SQLITE_EMPTY=16 数据库表为空
    • SQLITE_ABORT=4 回调函数请求中断
    • SQLITE_SCHEMA=17 数据库模式改变
    • SQLITE_BUSY=5 数据库文件被锁
    • SQLITE_TOOBIG=18 一个表数据行过多
    • SQLITE_LOCKED=6 数据库中的一个表被锁
    • SQLITE_CONSTRAINT=19 由于约束冲突而中止
    • SQLITE_NOMEN=7 内存分配失败
    • SQLITE_MISMATCH=20 数据类型不匹配
    • SQLITE_READONLY=8 试图对一个只读数据库进行写操作
    • SQLITE_MISUSE=21 数据库错误使用
    • SQLITE_INTERRUPT=9 由sqlite_interrupt()结束操作
    • SQLITE_NOLFS=22 使用主机操作系统不支持的特性
    • SQLITE_IOERR=10 磁盘I/O发生错误
    • SQLITE_AUTH=23 非法授权
    • SQLITE_CORRUPT=11 数据库磁盘镜像畸形
    • SQLITE_FORMAT=24 辅助数据库格式错误
    • SQLITE_NOTFOUND=12(Internal Only)表或记录不存在
    • SQLITE_NOTADB=26 打开的不是一个数据库文件
  • 相关阅读:
    (转)社会青年应如何自学英语?
    WEB标准学习路程之"CSS":13.声明,单位
    8大致命生活毛病(转)
    VS2008小Bug??
    【细嚼慢咽大数据】第一章——数据挖掘基本概念,邦弗朗尼原理,IF.IDF指标,哈希函数
    【Linux操作系统分析】定时测量——RTC,TSC,PIT,jiffies,计时体系结构,延迟函数
    【Git】Git上传本地项目的命令以及nonfastforward updates were rejected的解决办法
    【Linux操作系统分析】Ubuntu12.04内核升级和添加系统调用
    【折腾ubuntu】Ubuntu12.04安装windows版本的福昕阅读器
    【二】zTree checkbox
  • 原文地址:https://www.cnblogs.com/sunyanyan/p/5390813.html
Copyright © 2011-2022 走看看