使用
在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进行数据读取采用了游标的形式,每次只能读取一行数据,较为麻烦。
添加framework
需要添加libsqlite3.tbd(老版本xocde中叫libsqlite3.dylib)
打开/创建数据库:
1 |
|
执行语句
执行插入、修改、删除语句
1 | -(BOOL)executeNonQuery:(NSString *)sql{ |
执行查询语句
1 |
|
说明
一些方法:
- 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 打开的不是一个数据库文件