打开、关闭、创建 数据库 -sqlite 基础教程(4)
来源:互联网 发布:安卓摄像机软件 编辑:程序博客网 时间:2024/05/17 20:24
上一讲的最后我留了点悬念,不知道上一讲看完你有木有疑问。我的疑问就是我创建了一个句柄,但是我怎么知道这个句柄指向的是磁盘上哪个数据库文件呢?我们只是创建了一个指针,指向一个 sqlite3 类型的结构体。里面的数据都是空的或者默认的。我们接下来要做的就是去为这个结构体申请内存并填充这个结构体。是不是感觉又被吓到了?这个结构体这么庞大,我们自己去填充还不的猴年马月啊。一切都不用害怕,并不需要我们显式的去填充它,我们只需要告诉它一些最基本的信息,然后调用API让API去帮我们填充。
目前我们只需要告诉这个结构体一个信息,就是数据库文件的路径。然后调用 sqlite3_open 函数就OK了。
SQLITE_API int sqlite3_open(//SQLITE_API 是个宏,用来标注API的不用理它 const char *zFilename, sqlite3 **ppDb );第一个参数是路径,const char * 型,第二个参数是数据库句柄的指针,注意是一个二级指针,我们声明的一级指针,所以我们还要加一个取地址符&,请看我下面的实例:
int ret = sqlite3_open( getFilePath(), &pdb);//不要奇怪,其实打开数据库就是获得数据库的一些信息,然后方便我们操纵它,不是吗?通过这个函数 我们把 数据库与 句柄 pdb 绑定在一起了,我们以就通过 这个 pdb 来操纵数据库了。在这个函数中第一个参数是数据库文件的路径(包括文件名),我一般会把路径写成一个函数,这样遵循编码原则(这里用到的原则是一个函数尽量只做一件事情),建议你也这样,好处你自己可以慢慢体会到。我获取路径的函数如下你可以参考一下:
const char* getFilePath(){ return [[NSString stringWithFormat:@"%@/Documents/db",NSHomeDirectory() ] UTF8String]; //不好意思这里用到了与IOS相关的一点东西,不过这个也没办法,除非我写成绝对路径,但是那样是行不通的 // 不过也没关系,你移植到别处肯定也是要改路径的咯,所以移植的时候改一下就好了}还有一点就是返回值,返回值我们用来判断是否执行成功。sqlite 中帮我们定义了一系列的宏,用来作为返回值:
#define SQLITE_OK 0 /* Successful result *//* beginning-of-error-codes */#define SQLITE_ERROR 1 /* SQL error or missing database */#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */#define SQLITE_PERM 3 /* Access permission denied */#define SQLITE_ABORT 4 /* Callback routine requested an abort */#define SQLITE_BUSY 5 /* The database file is locked */#define SQLITE_LOCKED 6 /* A table in the database is locked */#define SQLITE_NOMEM 7 /* A malloc() failed */#define SQLITE_READONLY 8 /* Attempt to write a readonly database */#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */#define SQLITE_CORRUPT 11 /* The database disk image is malformed */#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */#define SQLITE_FULL 13 /* Insertion failed because database is full */#define SQLITE_CANTOPEN 14 /* Unable to open the database file */#define SQLITE_PROTOCOL 15 /* Database lock protocol error */#define SQLITE_EMPTY 16 /* Database is empty */#define SQLITE_SCHEMA 17 /* The database schema changed */#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */#define SQLITE_MISMATCH 20 /* Data type mismatch */#define SQLITE_MISUSE 21 /* Library used incorrectly */#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */#define SQLITE_AUTH 23 /* Authorization denied */#define SQLITE_FORMAT 24 /* Auxiliary database format error */#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */#define SQLITE_NOTADB 26 /* File opened that is not a database file */#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */#define SQLITE_DONE 101 /* sqlite3_step() has finished executing *//* end-of-error-codes */
有了这些我们就可以更加方便地调试我们的代码了。
好了,进入正题,上面这个函数就是在数据库存在的情况下打开数据库,不存在的情况下创建数据库,数据库的名字可以随便乱取,只要是ASCII字符就好了,因为sqlite数据库本来就是一个ASCII文件(所以它的安全性还是不大行的,不过作为本地数据库没啥问题)。
数据库打开后我们就可以进行一系列的增删查改的操作了,操作完毕我们就要关闭数据库,不是么?否则怎么释放资源呢?
关闭也很简单:
SQLITE_API int sqlite3_close(sqlite3 *db);这个就不用解释了吧,直接看我的实例:
sqlite3_close(pdb);// 这里就可以不去考虑返回值了
好了,这一节又讲完了。是不是觉得很简单。OK,期待下一节吧,下一节我们学习:创建表。
文章出处:http://m.blog.csdn.net/blog/iukey/7336529
0 0
- 打开、关闭、创建 数据库 -sqlite 基础教程(4)
- 打开、关闭、创建 数据库 -sqlite 基础教程(4)
- 打开、关闭、创建 数据库 -sqlite 基础教程(4)
- Qt操作SQLite数据库——创建、打开、关闭、增加、删除和修改操作
- Qt操作SQLite数据库——创建、打开、关闭、增加、删除和修改操作
- 创建表-sqlite 基础教程(5)
- 创建表-sqlite 基础教程(5)
- 创建表-sqlite 基础教程(5)
- 三、创建与打开sqlite数据库
- sql/sqlite/sqlite3 创建和打开数据库
- 创建、修改、打开、关闭、显示、删除数据库
- 9. --SQLite 关闭数据库
- SQLite 创建与打开
- SQLite学习笔记二《打开或创建一个数据库》
- Android SQLiteOpenHelper Sqlite数据库的创建与打开
- 2. --SQLite 打开数据库
- 打开SQlite数据库
- 打开sqlite数据库失败
- 一个简单的链表实现
- 源码详解openfire保存消息记录_修改服务端方式
- iOS开发学习第三课——循环结构
- redis内存容量的预估和优化
- 5-10
- 打开、关闭、创建 数据库 -sqlite 基础教程(4)
- linux软链接和硬链接
- POJ-3191(负进制那点事儿)
- openFire 源码解读
- 趣题:选出最多的大小为奇数的子集,使得两两的交集大小都是偶数
- Hierarchy Viewer某些手机不能加载解决方案
- 第39讲-项目四-回文数
- 欢迎使用CSDN-markdown编辑器
- Linux运维利器之ClusterShell