使用iOS原生sqlite3框架对sqlite数据库进行操作
一、引言
sqlite数据库是一种小型数据库,由于其小巧与简洁,在移动开发领域应用深广,sqlite数据库有一套完备的sqlite语句进行管理操作,一些常用的语句和可视化的开发工具在上篇博客中有介绍,地址如下:
sqlite数据库常用语句及可视化工具介绍:http://my.oschina.net/u/2340880/blog/600820。
在iOS的原生开发框架中可以对sqlite数据库进行很好的支持,这个框架中采用C风格且通过指针移动进行数据的操作,使用起来有些不便,我们可以对一些数据库的常用操作进行一些面向对象的封装。
二、libsqlite3系统库中操作数据库的常用方法
libsqlite3是对sqlite数据库进行操作的系统库,在使用前,我们需要先导入,点击Xcode的Build Phases标签,展开Link Binary With Libraries,点击+号,在弹出的窗口中搜索libsqlite3.0,将其导入进工程,过程如下图:
在需要操作sqlite数据的文件中导入如下头文件:
#import <sqlite3.h>
数据库文件的操作是由一个sqlite3类型的指针操作管理的,如下方法进行数据库的打开:
sqlite3 *sqlite;
sqlite3_open(dataBaePath, &sqlite)
sqlite3_open方法返回一个int值,实际上,在使用libsqlite3框架中的大多方法时都会返回一个int值,这个int值代表着方法执行的相应结果状态,这些状态再sqlite3.h文件中通过宏来定义,列举如下:
#define SQLITE_OK 0 //操作成功
/* 以下是错误代码 */
#define SQLITE_ERROR 1 /* SQL数据库错误或者丢失*/
#define SQLITE_INTERNAL 2 /* SQL内部逻辑错误 */
#define SQLITE_PERM 3 /* 没有访问权限 */
#define SQLITE_ABORT 4 /* 回调请求终止 */
#define SQLITE_BUSY 5 /* 数据库文件被锁定 */
#define SQLITE_LOCKED 6 /* 数据库中有表被锁定 */
#define SQLITE_NOMEM 7 /* 分配空间失败 */
#define SQLITE_READONLY 8 /* 企图向只读属性的数据库中做写操作 */
#define SQLITE_INTERRUPT 9 /* 通过sqlite3_interrupt()方法终止操作*/
#define SQLITE_IOERR 10 /* 磁盘发生错误 */
#define SQLITE_CORRUPT 11 /* 数据库磁盘格式不正确 */
#define SQLITE_NOTFOUND 12 /* 调用位置操作码 */
#define SQLITE_FULL 13 /* 由于数据库已满造成的添加数据失败 */
#define SQLITE_CANTOPEN 14 /* 不法打开数据库文件 */
#define SQLITE_PROTOCOL 15 /* 数据库锁协议错误 */
#define SQLITE_EMPTY 16 /* 数据库为空 */
#define SQLITE_SCHEMA 17 /* 数据库模式更改 */
#define SQLITE_TOOBIG 18 /* 字符或者二进制数据超出长度 */
#define SQLITE_CONSTRAINT 19 /* 违反协议终止 */
#define SQLITE_MISMATCH 20 /* 数据类型不匹配 */
#define SQLITE_MISUSE 21 /* 库使用不当 */
#define SQLITE_NOLFS 22 /* 使用不支持的操作系统 */
#define SQLITE_AUTH 23 /* 授权拒绝 */
#define SQLITE_FORMAT 24 /* 辅助数据库格式错误 */
#define SQLITE_RANGE 25 /* sqlite3_bind 第二个参数超出范围 */
#define SQLITE_NOTADB 26 /* 打开不是数据库的文件 */
#define SQLITE_NOTICE 27 /* 来自sqlite3_log()的通知 */
#define SQLITE_WARNING 28 /* 来自sqlite3_log() 的警告*/
#define SQLITE_ROW 100 /* sqlite3_step() 方法准备好了一行数据 */
#define SQLITE_DONE 101 /* sqlite3_step() 已完成执行*/
执行非查询类的语句,例如创建,添加,删除等操作,使用如下方法:
char * err;
sqlite3 *sql;
sqlite3_exec(sql, sqlStr, NULL, NULL, &err);
sqlite3_exec方法中第一个参数为成功执行了打开数据库操作的sqlite3指针,第二个参数为要执行的sql语句,最后一个参数为错误信息字符串。
执行查询语句的方法比较复杂,通过如下方法:
sqlite3 * sqlite;
sqlite3_stmt *stmt =nil;
int code = sqlite3_prepare_v2(sqlite, sqlStr, -1, &stmt, NULL);
while (sqlite3_step(stmt)==SQLITE_ROW) {
char * cString =(char*)sqlite3_column_text(stmt, 0);
NSString * value = [NSString stringWithCString:cString?cString:"NULL" encoding:NSUTF8StringEncoding];
NSNumber * value = [NSNumber numberWithLongLong:sqlite3_column_int64(stmt, 1)];
}
sqlite3_finalize(stmt);
stmt是一个数据位置指针,标记查询到数库的数据位置,sqlite3_prepare_v2()方法进行数据库查询的准备工作,第一个参数为成功打开的数据库指针,第二个参数为要执行的查询语句,第三个参数为sqlite3_stmt指针的地址,这个方法也会返回一个int值,作为标记状态是否成功。
sqlite3_step方法对stmt指针进行移动,会逐行进行移动,这个方法会返回一个int值,如果和SQLITE_ROW宏对应,则表明有此行数据,可以通过while循环来对数据进行读取。
sqlite3_column_XXX()是取行中每一列的数据,根据数据类型的不同,sqlite3_column_XXX()有一系列对应的方法,这个方法中第一个参数是stmt指针,第二个参数为列序号。
sqlite3_finalize()方法对stmt指针进行关闭。