打开、关闭、创建 数据库 -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