• 6916阅读
  • 7回复

QSqlite怎么保存二进制数据 [复制链接]

上一主题 下一主题
离线sno_guo
 
只看楼主 倒序阅读 楼主  发表于: 2012-10-12

QSqlite怎么保存二进制数据
大家好,因为做嵌入式,经常遇到结构体数组,如下
typedef struct __test_s
{
  uint8_t one,
  uint16_t two,
}test_s;
这样的数据,我想把他用QSqlite来保存,可是发现QSqlite在保存的时候,好像数据格式只能是QString类型的,不能是别的。请问下怎么保存二进制数据,谢谢!


我的想法是:把二进制转换为字符串保存起来,但是这样在读取的时候字符串转换为二进制会出问题的,假如我保存的200这一个字节,但字符串转换出来后可能是2 0 0 分成三个字节了,很不好。


请问下大家是怎么保存的,谢谢!
离线XChinux

只看该作者 1楼 发表于: 2012-10-12
用bindValue, addBindValue
参数是QVariant ,可以将数据转换成QByteArray类型的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线sno_guo
只看该作者 2楼 发表于: 2012-10-12
谢谢回复,我把数据先保存到QByteArray中,然后才存放到SQlite中的,下面是我的操作。

这个是我定义的结构体---测试
#pragma pack(push,1)
typedef struct __test_s
{
unsigned char one;
unsigned short two;
unsigned int four;
unsigned char buffer[3];
}test_s;
#pragma pack(pop)
保存到SQlite前的操作
test_s stTest;
stTest.buffer[0]=2;
stTest.buffer[1]=14;
stTest.buffer[2]=235;
stTest.four=240;
stTest.one=250;
stTest.two=99;
QByteArray baTest((char *)&stTest,sizeof(test_s));

下面是我从里面读出来的
QByteArray ele2=query->value(0).toByteArray();
QChar *qcPtr=(QChar *)ele2.data();
test_s *ptr=(test_s *)qcPtr;
fprintf(stderr,"%d,%d,%d\n",ptr->buffer[0],ptr->one,ptr->two);
可是发现,读出的数据和写入的数据两者不一样,不知道是怎么回事,谢谢了
离线jdwx

只看该作者 3楼 发表于: 2012-10-13
保存:用QDataStream把QByteArray当作文件,写入数据。
取出:读文件的方式。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线sno_guo
只看该作者 4楼 发表于: 2012-10-14
哦,谢谢回复,我的意思是我想用sqlite把二进制的结构体数据保存起来,我不知道怎么保存。
用bindvalue, 这个可以写进入,读出来的时候总是错误,请问下为什么。
离线jdwx

只看该作者 5楼 发表于: 2012-10-15
回 4楼(sno_guo) 的帖子
QByteArray ba;
QDataStream out(&ba,QIO/*不记得了,writeonly*/);
out << struct.a<<struct.b<<struct.c;
将ba写入数据库

从数据库读出ba
读出struct:
QDataStream in(ba);
in>>struct.a>>struct.b......;

发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线jdwx

只看该作者 6楼 发表于: 2012-10-15
struct内的数据类型必须是QDataStream支持的,不支持的需要先转换。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线sno_guo
只看该作者 7楼 发表于: 2012-10-19
哦,谢谢,谢谢,这个我试试,十分感谢!
快速回复
限100 字节
 
上一个 下一个