Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2676500
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: iOS平台

2015-09-02 11:30:59

sqlite 句柄-sqlite 基础教程(3)
http://blog.csdn.net/iukey/article/details/7336369

上一讲的最后我留了点悬念,不知道上一讲看完你有木有疑问。我的疑问就是我创建了一个句柄,但是我怎么知道这个句柄指向的是磁盘上哪个数据库文件呢?我们只是创建了一个指针,指向一个 sqlite3 类型的结构体。里面的数据都是空的或者默认的。我们接下来要做的就是去为这个结构体申请内存并填充这个结构体。是不是感觉又被吓到了?这个结构体这么庞大,我们自己去填充还不的猴年马月啊。一切都不用害怕,并不需要我们显式的去填充它,我们只需要告诉它一些最基本的信息,然后调用API让API去帮我们填充。

目前我们只需要告诉这个结构体一个信息,就是数据库文件的路径。然后调用 sqlite3_open 函数就OK了。


  1. SQLITE_API int sqlite3_open(//SQLITE_API 是个宏,用来标注API的不用理它  
  2.   const char *zFilename,   
  3.   sqlite3 **ppDb   
  4. );  
第一个参数是路径,const char * 型,第二个参数是数据库句柄的指针,注意是一个二级指针,我们声明的一级指针,所以我们还要加一个取地址符&,请看我下面的实例:


  1. int ret = sqlite3_open( getFilePath(), &pdb);//  
 不要奇怪,其实打开数据库就是获得数据库的一些信息,然后方便我们操纵它,不是吗?通过这个函数 我们把 数据库与 句柄 pdb 绑定在一起了,我们以就通过 这个 pdb 来操纵数据库了。在这个函数中第一个参数是数据库文件的路径(包括文件名),我一般会把路径写成一个函数,这样遵循编码原则(这里用到的原则是一个函数尽量只做一件事情),建议你也这样,好处你自己可以慢慢体会到。我获取路径的函数如下你可以参考一下:
  1. const char* getFilePath(){  
  2.     return [[NSString stringWithFormat:@"%@/Documents/db",NSHomeDirectory() ] UTF8String];  
  3.             //不好意思这里用到了与IOS相关的一点东西,不过这个也没办法,除非我写成绝对路径,但是那样是行不通的  
  4.             // 不过也没关系,你移植到别处肯定也是要改路径的咯,所以移植的时候改一下就好了  
  5. }  
还有一点就是返回值,返回值我们用来判断是否执行成功。sqlite 中帮我们定义了一系列的宏,用来作为返回值:
  1. #define SQLITE_OK           0   /* Successful result */  
  2. /* beginning-of-error-codes */  
  3. #define SQLITE_ERROR        1   /* SQL error or missing database */  
  4. #define SQLITE_INTERNAL     2   /* Internal logic error in SQLite */  
  5. #define SQLITE_PERM         3   /* Access permission denied */  
  6. #define SQLITE_ABORT        4   /* Callback routine requested an abort */  
  7. #define SQLITE_BUSY         5   /* The database file is locked */  
  8. #define SQLITE_LOCKED       6   /* A table in the database is locked */  
  9. #define SQLITE_NOMEM        7   /* A malloc() failed */  
  10. #define SQLITE_READONLY     8   /* Attempt to write a readonly database */  
  11. #define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite3_interrupt()*/  
  12. #define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */  
  13. #define SQLITE_CORRUPT     11   /* The database disk image is malformed */  
  14. #define SQLITE_NOTFOUND    12   /* Unknown opcode in sqlite3_file_control() */  
  15. #define SQLITE_FULL        13   /* Insertion failed because database is full */  
  16. #define SQLITE_CANTOPEN    14   /* Unable to open the database file */  
  17. #define SQLITE_PROTOCOL    15   /* Database lock protocol error */  
  18. #define SQLITE_EMPTY       16   /* Database is empty */  
  19. #define SQLITE_SCHEMA      17   /* The database schema changed */  
  20. #define SQLITE_TOOBIG      18   /* String or BLOB exceeds size limit */  
  21. #define SQLITE_CONSTRAINT  19   /* Abort due to constraint violation */  
  22. #define SQLITE_MISMATCH    20   /* Data type mismatch */  
  23. #define SQLITE_MISUSE      21   /* Library used incorrectly */  
  24. #define SQLITE_NOLFS       22   /* Uses OS features not supported on host */  
  25. #define SQLITE_AUTH        23   /* Authorization denied */  
  26. #define SQLITE_FORMAT      24   /* Auxiliary database format error */  
  27. #define SQLITE_RANGE       25   /* 2nd parameter to sqlite3_bind out of range */  
  28. #define SQLITE_NOTADB      26   /* File opened that is not a database file */  
  29. #define SQLITE_ROW         100  /* sqlite3_step() has another row ready */  
  30. #define SQLITE_DONE        101  /* sqlite3_step() has finished executing */  
  31. /* end-of-error-codes */  

有了这些我们就可以更加方便地调试我们的代码了。

好了,进入正题,上面这个函数就是在数据库存在的情况下打开数据库,不存在的情况下创建数据库,数据库的名字可以随便乱取,只要是ASCII字符就好了,因为sqlite数据库本来就是一个ASCII文件(所以它的安全性还是不大行的,不过作为本地数据库没啥问题)。

数据库打开后我们就可以进行一系列的增删查改的操作了,操作完毕我们就要关闭数据库,不是么?否则怎么释放资源呢?

关闭也很简单:

  1. SQLITE_API int sqlite3_close(sqlite3 *db);  
 这个就不用解释了吧,直接看我的实例:
  1. sqlite3_close(pdb);// 这里就可以不去考虑返回值了  


好了,这一节又讲完了。是不是觉得很简单。OK,期待下一节吧,下一节我们学习:创建表。

阅读(589) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~