Chinaunix首页 | 论坛 | 博客
  • 博客访问: 541668
  • 博文数量: 102
  • 博客积分: 2146
  • 博客等级: 大尉
  • 技术积分: 1146
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-09 17:32
文章分类

全部博文(102)

文章存档

2015年(14)

2014年(24)

2013年(5)

2012年(30)

2011年(16)

2010年(13)

分类: Windows平台

2015-07-18 13:04:28

从性能上说,XML方式的存储基本可以满足1 MB以下的存储要求。但在更复杂的情景中,我们可能需要存储多种不同的类,每个类也需要存储不同的对象,此时XML存储的速度就将成为瓶颈。即便分文件存储,管理起来也很麻烦,这个时候可以引入数据库来提升存储效率。
? 关系数据库是一种经典的数据库,其中的数据被组织成表的形式,具有相同形式的数据存放在同一张表中,表内每一行代表一个数据。在表的基础上,数据库为我们提供增、删、改、查等操作,这些操作通常采用SQL(结构化查询语言)表达。这种格式化、集中的存储再加上结构化的操作语言带来一个非常大的好处:可以进行深度的优化,大大提升存储和操作的效率。
? SQLite是移动设备上常用的一个嵌入式数据库,具有开源、轻量等特点,其源代码只有两个".c"文件和两个".h"文件,并且已经包括了充分的注释说明。相比MySQL或者SQL Server这样的专业级数据库,甚至是比起同样轻量级的Access,SQLite的部署都可谓非常简单,只要将这4个文件导入工程中即可,这使得编译之后的SQLite非常小。

? SQLite将数据库的数据存储在磁盘的单一文件中,并通过简单的外部接口提供SQL支持。由于其设计之初即是针对小规模数据的操作,在查询优化、高并发读写等方面做了极简化的处理,可以保证不占用系统额外的资源,因此,在大多数的嵌入式开发中,会比专业数据库有更快速、高效的执行效率。


好了,看看如何加入Sqlite3吧,先从官网,下载你所想要的版本的sqlite,我这下的是3.8.2的,在解压后,只有4个文件,没有.def或者是什么dll,lib,这个是要自己生成的。


解压后,将这四个文件添加到你的当前工程中,然后进行编译一下就可以了。


好了,先看个如何创建一个表:


  1. 回调函数的格式如下:  
  2. int sqlite_callback(  
  3.     void* pv,    /* 由 sqlite3_exec() 的第四个参数传递而来 */  
  4.     int argc,        /* 表的列数 */  
  5.     char** argv,    /* 指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到 */  
  6.     char** col        /* 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 */  
  7. );  
  8.   
  9. 参数格式:  
  10.     传给sqlite3_exec的回调函数,用来显示查询结果  
  11.     对每一条查询结果调用一次该回调函数  
  12. 参数:  
  13.     pv:由sqlite3_exec传递的初始化参数  
  14.     argc:表头的列数  
  15.     col:表头的名字数组指针  
  16.     argv:表头的数据数组指针  
  17. 返回值:  
  18.     1:中断查找  
  19.     0:继续列举查询到的数据  
  20. 示例表:  
  21. +-----------------------------------+  
  22. |  id  |  pic   |  data(16进制数据)  |  
  23. |-----------------------------------|  
  24. |   1  |  a.jpg |      00 00 00 ... |  
  25. |-----------------------------------|  
  26. |   2  |  b.jpg |     XX XX XX      |  
  27. +-----------------------------------+  
  28. 对第一行数据:  
  29.     argc=3 即 [0]...[2]  
  30.     argv[0]="1",argv[1]="a.jpg",argv[2]="00 00 00..."(实际16进制数据,非这里显示的字符串形式)  
  31.     col[0]="id",col[1]="pic",col[2]="data"  
  32.    
  33. 说明:  
  34.     sqlite3_exec() 的回调函数必须按照此格式, 当然形参的名字任意.  
  35.     如果某列的数据类型不是char*, 则可以对结果执行相关的转换, 如:用atoi()把结果转换为整数(integer), 如果是二进制数据, 则可以直接强制类型转换, 如:(void*)argv[i].  
  36.     该回调函数有两种返回值类型.  
  37.         1.返回零:sqlite3_exec() 将继续执行查询.  
  38.         2.返回非零:sqlite3_exec()将立即中断查询, 且 sqlite3_exec() 将返回 SQLITE_ABORT.  
  39. 示例:  
  40.     int i;  
  41.     for(i=0; i<argc; i++)  
  42.     {  
  43.         printf("%s\t%s\n\n", col[i], argv[i]);  
  44.     }  
  45.   
  46. 例子:  
  47.     m_pGameDataBase = prepareTableInDB( "MyGame2""E:\\database\\MyGame");  
  48.   
  49.     std::string insert_sql_("insert into MyGame2 values(123, \"aaa\", 26, \"man\")");  
  50.     insertRecordIntoSqlite(insert_sql_);  
  51.       
  52.     readRecord();// read the record  
  53.   
  54.   
  55. //  
  56. int  readFromSQLite(void *anyParam, int iColumn, char **pColumnValue, char **pColumnName ) {  
  57.     int icolumenCount = iColumn;  
  58.     for(int i = 0; i < icolumenCount; ++i) {  
  59.         CCLOG("%s: %s \n", pColumnName[i], pColumnValue[i]);  
  60.     }  
  61.     return 0;  
  62. }  
  63.   
  64. void GameController::readRecord() {  
  65.     std::string read_sql_("select * from MyGame2");  
  66.     char *perrMsg = 0;  
  67.     sqlite3_exec( m_pGameDataBase,  
  68.                         read_sql_.c_str(),  
  69.                         readFromSQLite,  
  70.                         NULL,  
  71.                         &perrMsg);  
  72. }  
  73.   
  74. sqlite3* GameController::prepareTableInDB(const char* table, const char* dbFilename) {  
  75.     sqlite3 *splite2Data = 0;  
  76.     char *errMsg = 0;  
  77.   
  78.     if(SQLITE_OK != sqlite3_open(dbFilename, &splite2Data)) {  
  79.         CCLOG("Open the Game Data Table falied\n");  
  80.         return 0;  
  81.     }  
  82.   
  83.     std::string string_sql = "create table if not exists " + std::string(table) + "(  id int unsigned auto_increment primary key,  name varchar(50),  age int,  sex varchar(10))";  
  84.   
  85.     sqlite3_exec(splite2Data,  
  86.                        string_sql.c_str(),  
  87.                        NULL,  
  88.                        NULL,  
  89.                        &errMsg); // create a table;  
  90.   
  91.     if(errMsg != 0) {  
  92.         CCLOG("Create the Data table failed\n");  
  93.         sqlite3_close(splite2Data);  
  94.         return 0;  
  95.     }  
  96.   
  97.     return splite2Data;  
  98. }  
  99.   
  100. void GameController::insertRecordIntoSqlite(std::string &r_stringOrder) {  
  101.     char *perrMsg = 0;  
  102.     int info =  sqlite3_exec(  m_pGameDataBase,  
  103.                                         r_stringOrder.c_str(),  
  104.                                        0,  
  105.                                        0,  
  106.                                        &perrMsg);  
  107.    do{  
  108.        if(perrMsg != 0) { // execute the instruct failed  
  109.            CCLOG("insert a record into the table failed\n");  
  110.            CCLOG("reason: %d, Error Message: %s \n", info, perrMsg);  
  111.            break;  
  112.        }  
  113.   
  114.    } while(0);    
  115.    sqlite3_close(m_pGameDataBase); //   
  116. }  
阅读(813) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~