1. 使用
在iOS中操作SQLite数据库可以分为以下几步(注意先在项目中导入libsqlite3框架):
- 添加libsqlite3.tbd
- 打开数据库,利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3类型的对象,后面需要借助这个对象进行其他操作。
- 执行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 打开的不是一个数据库文件