今天再過一次SQLite的用法
做了個例子,放在github上了。
https://github.com/slamdon/learn-IOS/tree/master/SQLite3
(抱歉,在整理github的時候已經刪掉了,如果要操作SQLite推薦使用FMDB這個library)
SQLite常用函數:
SQLite3_OPEN
1 2 3 4 5 6 7 |
SQLITE_API int sqlite3_open( const char * filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); |
- 用来打开filename指定的SQLite数据库,filename是用UTF-8格式转换的char*字符串。
- ppDb是数据库句柄的指针。除非不能为数据库句柄分配内存(返回NULL),通常都会返回一个数据库句柄甚至是发生错误的情况下。
- 成功打开数据库返回SQLITE_OK,如果出现异常,可以使用sqlite3_errmsg(contactDB)捕获异常信息描述。
SQLite3_close
1 |
SQLITE_API int sqlite3_close(sqlite3 *); |
- 用来关闭数据库,成功返回SQLITE_OK.
SQLite3_exec
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
SQLITE_API int sqlite3_exec( sqlite3*, /* An open database */ const char *sql, /* SQL to be evaluated */ int (*callback)(void*,int,char**,char**), /* Callback function */ void *, /* 1st argument to callback */ char **errmsg /* Error msg written here */ ); a convenience wrapper around ** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], ** that allows an application to run multiple statements of SQL ** without having to use a lot of C code. |
- 如果第三个参数不是NULL,符合SQL语句的每个记录都会调用这个回调函数。
- 第四个参数,是回调函数的第一个参数。
- 如果发生错误,停止执行,后续的语句被忽略。如果第五个参数不是NULL,它接收sqlite3_malloc()捕获的错误信息。当不在需要返回的错误信息时,为避免内存泄露,应使用sqlite3_free(errmsg);
SQLite_prepare_v2
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SQLITE_API int sqlite3_prepare_v2( sqlite3 *db, /* Database handle */ const char *zSql, /* SQL statement, UTF-8 encoded */ int nByte, /* Maximum length of zSql in bytes. */ sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const char **pzTail /* OUT: Pointer to unused portion of zSql */ ); |
编译SQL语句
- 执行SQL查询,必须先编译成字节编码程序。
- zSql是要进行编译的语句
- 如果nByte为负数,那么一直读到第一个‘\0’终止符,如果nByte为非负数,那么它就是能读取的zSql的最大字节数。先到‘\0’或者先到nByte字节就读到这里。
- 如果pzTail不是NULL,那么*pzTail指向zSql中第一个SQL语句结尾的下一个字节,也就是还没有编译过的。
- ppStmt指向编译过的可以被sqlite3_step()执行的语句,如果出错,它将指向NULL,如果zSql中不包括SQL,也将指向NULL。
- 如果成功该函数返回SQLITE_OK,如果失败返回错误编码。
SQLite3_step
1 |
SQLITE_API int sqlite3_step(sqlite3_stmt*); |
评估SQL语句
- SQLITE_BUSY说明无法捕获数据库。
- SQLITE_DONE说明语句成功执行完成。在没有调用sqlite3_reset()时,将不能再使用sqlite3_step()。
- SQLITE_ROW说明有数据返回,每次获得一条row进行处理,可以通过column access functions访问。再调用sqlite3_step()获得下一条数据。
- SQLITE_ERROR说明出错了,不能再调用sqlite3_step()。
- SQLITE_MISUSE说明这个方法调用得不正确。
抓不到這個範例了,請問能再上傳一次嗎?
謝謝
真不好意思,我發現比較早期的一些東西我已經刪除了,因為沒有做備份,所以已經消失了@@
不過,直接操作SQLite3比較麻煩,你可以查看那看FMDB,這是一個將SQLite3封裝過的library,操作起來方便很多!
github的連結在這裡https://github.com/ccgus/fmdb