导入SQLLite library并引入头文件

libsqlite3.dylib本身是个链接,在这里它指向libsqlite3.0.dylib。也就是说在这里你添加libsqlite3.dylib和添加libsqlite3.0.dylib其实是添加了同一个文件,没有区别,那为什么要添加libsqlite3.dylib呢?原因在于libsqlite3.dylib总是指向最新的sqlite3动态库,也就是说如果出现了新的动态库(如:libsqlite3.1.dylib)那libsqlite3.dylib将指向这个新的动态库(libsqlite3.1.dylib)而不在是libsqlite3.0.dylib了!所以建议还是要添加libsqlite3.dylib。

注:

On Mac OS X, frameworks are just libraries, packed into a bundle. Within the bundle you will find an actual dynamic library (libWhatever.dylib). The difference between a bare library and the framework on Mac is that a framework can contain multiple different versions of the library. It can contain extra resources (images, localized strings, XML data files, UI objects, etc.) and unless the framework is released to public, it usually contains the necessary .h files you need to use the library.

A library is just that, "a library". It is a collection of objects/functions/methods (depending on your language) and your application "links" against it and thus can use the objects/functions/methods. It is basically a file containing re-usable code that can usually be shared among multiple applications (you don't have to write the same code over and over again).


打开数据库链接sqlite3_open用法

原型:

[cpp] view plaincopy
  1. int sqlite3_open(
  2. const char *filename,   <span style="color:#009900;">/* Database filename (UTF-8) */</span>
  3. sqlite3 **ppDb          <span style="color:#009900;">/* OUT: SQLite db handle */</span>
  4. );

用这个函数开始数据库操作。需要传入两个参数,一是数据库文件名,比如:比如:E:/test.db. 在ios中可能是:

[cpp] view plaincopy
  1. NSArray * documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  2. NSString * dbPath = [[documentPath objectAtIndex:0] stringByAppendingPathComponent:@“test.db”];

文件名不需要一定存在,如果此文件不存在,sqlite会自动建立它。如果它存在,就尝试把它当数据库文件来打开。二是sqlite3**,即前面提到的关键数据结构。这个结构底层细节如何,你不要管它。 函数返回值表示操作是否正确,如果是SQLITE_OK则表示操作正常。相关的返回值sqlite定义了一些宏。具体这些宏的含义可以参考sqlite3.h 文件。里面有详细定义(顺便说一下,sqlite3 的代码注释率自称是非常高的,实际上也的确很高。只要你会看英文,sqlite 可以让你学到不少东西)。

关闭数据库链接sqlite3_close用法

原型:

[cpp] view plaincopy
  1. int sqlite3_close(sqlite3 *ppDb);

ppDb为刚才使用sqlite3_open打开的数据库链接

执行sql操作sqlite3_exec用法

原型:

[cpp] view plaincopy
  1. int sqlite3_exec(
  2. sqlite3* ppDb,                             <span style="color:#009900;">/* An open database */</span>
  3. const char *sql,                           <span style="color:#009900;">/* SQL to be evaluated */</span>
  4. int (*callback)(void*,int,char**,char**),  <span style="color:#009900;">/* Callback function */</span>
  5. void *,                                    <span style="color:#009900;">/* 1st argument to callback */</span>
  6. char **errmsg                             <span style="color:#009900;"> /* Error msg written here */</span>
  7. );

这就是执行一条sql 语句的函数。 第1个参数不再说了,是前面open函数得到的指针。第2个参数constchar*sql是一条sql 语句,以\0结尾。 第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。 第4个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写法,以及这个参数的使用。 第5个参数char** errmsg 是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行sqlite3_exec 之后,执行失败时可以查阅这个指针(直接cout<<errmsg得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个char*得到具体错误提示。
说明:通常,sqlite3_callback 和它后面的void*这两个位置都可以填NULL。填NULL表示你不需要回调。比如你做insert 操作,做delete操作,就没有必要使用回调。而当你做select 时,就要使用回调,因为sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。

exec 的回调

typedef int(*sqlite3_callback)(void*,int,char**,char**); 你的回调函数必须定义成上面这个函数的类型。下面给个简单的例子: //sqlite3的回调函数 //sqlite 每查到一条记录,就调用一次这个回调 int LoadMyInfo(void* para, int n_column, char** column_value, char** column_name);

//para是你在sqlite3_exec 里传入的void*参数通过para参数,你可以传入一些特殊的指针(比如类指针、结构指针), 然后在这里面强制转换成对应的类型(这里面是void*类型,必须强制转换成你的类型才可用)。然后操作这些数据

//n_column是这一条记录有多少个字段(即这条记录有多少列)

//char** column_value 是个关键值,查出来的数据都保存在这里,它实际上是个1维数组(不要以为是2维数组), 每一个元素都是一个char*值,是一个字段内容(用字符串来表示,以\0结尾)

//char** column_name 跟column_value是对应的,表示这个字段的字段名称

实例:

[cpp] view plaincopy
  1. 1 #include <iostream>
  2. 2 using namespace std;
  3. 3 #include "sqlite/sqlite3.h"
  4. 4 int callback(void*,int,char**,char**);
  5. 5 int main()
  6. 6 {
  7. 7     sqlite3* db;
  8. 8     int nResult = sqlite3_open("test.db",&db);
  9. 9     if (nResult != SQLITE_OK)
  10. 10     {
  11. 11         cout<<"打开数据库失败:"<<sqlite3_errmsg(db)<<endl;
  12. 12         return 0;
  13. 13     }
  14. 14     else
  15. 15     {
  16. 16         cout<<"数据库打开成功"<<endl;
  17. 17     }
  18. 18
  19. 19     char* errmsg;
  20. 20
  21. 21     nResult = sqlite3_exec(db,"create table MyTable(id integer primary key autoincrement,name varchar(100))",NULL,NULL,&errmsg);
  22. 22      if (nResult != SQLITE_OK)
  23. 23      {
  24. 24          sqlite3_close(db);
  25. 25          cout<<errmsg;
  26. 26          sqlite3_free(errmsg);
  27. 27         return 0;
  28. 28     }
  29. 29     string strSql;
  30. 30     strSql+="begin;\n";
  31. 31     for (int i=0;i<100;i++)
  32. 32     {
  33. 33         strSql+="insert into MyTable values(null,'heh');\n";
  34. 34     }
  35. 35     strSql+="commit;";
  36. 36     //cout<<strSql<<endl;
  37. 37
  38. 38     nResult = sqlite3_exec(db,strSql.c_str(),NULL,NULL,&errmsg);
  39. 39
  40. 40     if (nResult != SQLITE_OK)
  41. 41     {
  42. 42         sqlite3_close(db);
  43. 43         cout<<errmsg<<endl;
  44. 44         sqlite3_free(errmsg);
  45. 45         return 0;
  46. 46     }
  47. 47
  48. 48     strSql = "select * from MyTable";
  49. 49     nResult = sqlite3_exec(db,strSql.c_str(),callback,NULL,&errmsg);
  50. 50       if (nResult != SQLITE_OK)
  51. 51     {
  52. 52         sqlite3_close(db);
  53. 53         cout<<errmsg<<endl;
  54. 54         sqlite3_free(errmsg);
  55. 55         return 0;
  56. 56     }
  57. 57
  58. 58     sqlite3_close(db);
  59. 59     return 0;
  60. 60 }
  61. 61
  62. 62 int callback(void* ,int nCount,char** pValue,char** pName)
  63. 63 {
  64. 64     string s;
  65. 65     for(int i=0;i<nCount;i++)
  66. 66     {
  67. 67         s+=pName[i];
  68. 68         s+=":";
  69. 69         s+=pValue[i];
  70. 70         s+="\n";
  71. 71     }
  72. 72     cout<<s<<endl;
  73. 73     return 0;
  74. 74 }

SQLLite (二) :sqlite3_open, sqlite3_exec, slite3_close相关推荐

  1. sqlite入门基础(一):sqlite3_open,sqlite3_exec,slite3_close

    打开数据库链接sqlite3_open用法 原型: int sqlite3_open(const char *filename, /* Database filename (UTF-8) */sqli ...

  2. VC API常用函数简单例子大全(1-89)

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

  3. sqlite3_exec及其回调函数

    一)sqlite3_exec 1.头文件和函数原型 #include "sqlite3.h"int sqlite3_exec(sqlite3*, const char *sql, ...

  4. sqlite3API函数

    回顾: DDL 表的创建.修改.删除 create table 表名(字段名 字段类型 [约束],...); alter table 表名 {rename to 新名字 | add column 字段 ...

  5. SQLite相关知识

    例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行 sqlite3_exec(db, "insert into name values 'lxkxf', '24'; " ...

  6. 数据库 sqlite 进阶

    http://www.cppblog.com/czy463/archive/2013/12/16/204816.html 董淳光 前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品 ...

  7. Sqlite3 ---------------用法

    前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总觉得不够.这些天再次研究它,又有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记. 这里要注明,我是一个跨 ...

  8. 嵌入式SQLite数据库架构和设计

    SQLite是一个开源的.内嵌式的关系型数据库.SQLite和Oracle和Access一样是文件型数据库,就是说,一个数据库就是一个文件,此数据库里可以建立很多的表,可以建立索引.触发器等等,但是它 ...

  9. Sqlite c/c++ api 学习

    Sqlite是我最喜欢使用的文件数据库,它小巧.方便.速度快.支持大部分标准sql语句.开源.免费 .. .. .. 优点太多了.自从认识了她之后,我就将Access打入了冷宫,发誓以后再也不用Acc ...

最新文章

  1. 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面
  2. 【Greenplum异常】数据库报错 could not create temporary file No space left on device(求解决)
  3. 深度学习总结:Tensorboard可视化里面的events, graph, histogram
  4. Linux线程退出、资源回收、资源清理的方法
  5. 基于FFmpeg的音频编码(PCM数据编码成AAC android)
  6. C++继承机制(三)——多继承、菱形继承、虚继承原理
  7. vue项目 拷到别的电脑应该怎吗再次重新运行
  8. 80X86寄存器介绍
  9. Atitit.获得向上向下左的右的邻居的方法 软键盘的设计..
  10. php把字符串日期转成时间戳,php怎样把日期转成时间戳
  11. opencv摄像头速度慢_opencv 摄像头操作详解
  12. 服务器字体放在服务器什么位置,服务器缺少字体如何查看与添加
  13. no ip domain lookup
  14. 如何在win7系统上装苹果雪豹操作系统
  15. 淘宝宝贝的标题,到底要如何优化,不妨进来看看,也许对你有帮助
  16. Android开发基础学习总结
  17. 什么是强化学习呢,来涨波知识
  18. mac装linux iso不用u盘安装,在任何mac上用u盘安装OSX和Windows10双系统的方法(支持老电脑、不用Bootcamp)...
  19. 符合SEO标准的div+css页面参考
  20. 通过注册表设置VMware Horizon View Client SSL配置

热门文章

  1. 私有属性和方法-通过父类方法间接访问
  2. 几个使用linux内核的系统,[科普] Linux 的内核与 Linux 系统之间的关系
  3. java动物飞翔接力赛源程序_java-submityourcode
  4. jar打包 剔除第三方依赖以及它的依赖_为什么Spring Boot的 jar 可以直接运行?
  5. int型数据占用的内存空间及ASCII码表
  6. Vue源码解析之AST语法树(三)
  7. Git撤销修改场景及对应指令(checkout、reset、revert)详解
  8. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序
  9. 数据库索引的实现原理及查询优化
  10. nagios nrpe