利用Sqlite数据库的blob类型存储自定义的数据类型(小寿转载)
发布时间:2020-12-12 19:59:55 所属栏目:百科 来源:网络整理
导读:sqlite数据库的其他作用在这里就不阐述了,直接进入正题吧! 如何利用sqlite数据库的blob类型存取自定义的数据类型,本人苦苦挣扎了一天,在网上搜了个遍也没找着看起来似乎有用的介绍,所以本人挨个试,最终功夫不负有心人,终于在快要下班的时候把它给调出
sqlite数据库的其他作用在这里就不阐述了,直接进入正题吧!
如何利用sqlite数据库的blob类型存取自定义的数据类型,本人苦苦挣扎了一天,在网上搜了个遍也没找着看起来似乎有用的介绍,所以本人挨个试,最终功夫不负有心人,终于在快要下班的时候把它给调出来了,为了大家避免走弯路,这里有必要拿出来与大家共同分享。 下面举例说明: 首先我们可以自定义一个数据类型 #include "stdafx.h" #include "sqlite3.h" //sqlite数据库对应的函数库的头文件 #include "string" #include "vector" #include <iostream> using namespace std; typedef struct student_ { int sno; string sname; }student; //学生的结构 初始化各数据 vector<student> 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,&zErrMsg); if(result != SQLITE_OK) { return false; //创建失败 } sql = "insert into poi_info_prvc440000 //插入数据,这里采用预编译的形式,凡是二进制的数据都要这样处理 values(?,?)"; result = sqlite3_prepare(db,-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",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,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<blob_size;i++) { cout<<student2[i].sno<<" "<<student2[i].sname<<endl; //输出数据 } } return 1; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |