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 打开的不是一个数据库文件
posted @ 2016-04-14 13:50  孙焱焱  阅读(1361)  评论(0编辑  收藏  举报