Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1130528
  • 博文数量: 91
  • 博客积分: 10053
  • 博客等级: 上将
  • 技术积分: 1335
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-01 12:46
文章分类
文章存档

2011年(4)

2010年(22)

2009年(22)

2008年(43)

分类: LINUX

2010-03-09 17:18:40

sqlite数据库的其他作用在这里就不阐述了,直接进入正题吧!
如何利用sqlite数据库的blob类型存取自定义的数据类型,本人苦苦挣扎了一天,在网上搜了个遍也没找着看起来似乎有用的介绍,所以本人挨个试,最终功夫不负有心人,终于在快要下班的时候把它给调出来了,为了大家避免走弯路,这里有必要拿出来与大家共同分享。
下面举例说明:
首先我们可以自定义一个数据类型
#include "stdafx.h"  
#include "sqlite3.h"     //sqlite数据库对应的函数库的头文件
#include "string"
#include "vector"
#include
using namespace std;
typedef struct student_
{
 int sno;
 string sname;
}student;     //学生的结构

初始化各数据
vector student1;     //生成学生数据表
void InitData()
{
    student student_value[5] = {{1,"张三"},{2,"李四"},{3,"王武"},\
    {4,"韩寒"},{5,"赵凤"}};           //定义一个数组
   for(int i=0;i<5;i++)
   {
      student1.push_back(student_value[i]);   //数组存入vector容器里
   }
 
}
int main(int argc,char* argv[])
{
    InitData();   //初始化
    sqlite3* db;
    char* zErrMsg = NULL;        //报错信息
    sqlite3_stmt * stat = NULL;  //预编译使用到的一个很重要的数据结构
    int result;                                //查看sql语句执行情况的返回值
    const char* filename = "my.db";      //数据库名
    result = sqlite3_open(filename,&db); //如果存在则打开,不存在则创建
    if(result != SQLITE_OK)            
    { 
       return -1;                   //创建失败返回
    }
 
    string sql;
    sql = "create table poi_info_prvc440000 \       //创建对应的表,这里用到了blob类型,不能重复创建表,创建之后就不要再创建了
     (keyword text,\
     jp_index_blob blob)" ;
    result = sqlite3_exec(db,sql.c_str(),NULL,NULL,&zErrMsg);
    if(result != SQLITE_OK)
    {
        return false;                           //创建失败
    }
    sql = "insert into poi_info_prvc440000 \            //插入数据,这里采用预编译的形式,凡是二进制的数据都要这样处理
    values(?,?)";
   result = sqlite3_prepare(db,sql.c_str(),-1,&stat,0);  //预编译
    void* buffer ;                                            //创建内存指针
    buffer = new char(sizeof(student)*student1.size());   //初始化存储空间,sizeof(student)为数据结构的大小,student1.size()为vector数组的长度,这里是整个算法中最关键的部分,一旦出错,下边就不可能再对了,
    memcpy(buffer,(char*)&student1[0],sizeof(student)*student1.size()); //这里必需用student1[0]不能用student1,因为这里的
                                                                        //student1是vector模板类型
 
    result = sqlite3_bind_text(stat,1,"A",-1,NULL);           //绑定表的第一个字段,这里为text类型
    result = sqlite3_bind_blob(stat,2,buffer,sizeof(student)*student1.size(),NULL);   //绑定blob类型
    result = sqlite3_step(stat);                              //执行sql语句,这样就把数据存到数据库里了
   if(result != SQLITE_DONE)
   {
       printf("insert into blob value failure!");
       return false;
   }
 
    student *student2;
    sql = "select jp_index_blob from poi_info_prvc440000 where keyword = 'A' limit 1";      //查找一行的数据
    result = sqlite3_prepare(db,sql.c_str(),-1,&stat,0);                                  
    result = sqlite3_step(stat);
    if(result == SQLITE_ROW)
    {
          int blob_size = sqlite3_column_bytes(stat,0)/sizeof(student);                  //获取数组的长度
          student2 = (student*)sqlite3_column_blob(stat,0);                              //获取数组的头指针
          for(int i = 0 ;i          {
                cout<
          }
    }
    return 1;
}
 
 
阅读(9241) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~