因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类
1. 利用memcpy拷贝内存数据
//自定义person结构体
-
typedef struct
-
{
-
int age;
-
char name[20];
-
}Person;
-
-
-
void writeStruct()
-
{
-
QByteArray ba;
-
ba.resize(2*sizeof(Person));
-
-
-
for(int i=0;i<2;i++)
-
{
-
Person p1;
-
p1.age=10+i;
-
strcpy(p1.name,"javaeye");
-
memcpy(ba.data()+i*sizeof(Person),&p1,sizeof(Person));
-
}
-
-
-
Person *person=(Person*)ba.data();
-
qDebug()<age<<"---"<name;
-
-
person++;
-
qDebug()<age<<"---"<name;
-
}
memcpy只能处理字段为基本类型的结构体, 当使用QString name, 我用person->name去访问其值, 程序崩溃; 由此可见,内存数据无法还原构建成QString类. 如果要写入自定的QT类, 只能借助QBuffer了, 通过二进制流写入
2. QBuffer写入QT自定义结构体
-
-
typedef struct
-
{
-
int age;
-
QString name;
-
}QPerson;
-
-
-
-
-
inline QDataStream &operator<<(QDataStream &out,const QPerson &per)
-
{
-
out<
-
return out;
-
}
-
-
-
-
-
inline QDataStream &operator>>(QDataStream &in,QPerson &per)
-
{
-
int age;
-
QString name;
-
in>>age>>name;
-
-
per.age=age;
-
per.name=name;
-
return in;
-
}
-
-
-
-
-
void testQBuffer()
-
{
-
QByteArray ba;
-
ba.resize(2*sizeof(QPerson));
-
-
QBuffer buffer(&ba);
-
buffer.open(QIODevice::WriteOnly);
-
-
-
QDataStream out(&buffer);
-
for(int i=0;i<2;i++)
-
{
-
QPerson per;
-
per.age=20+i;
-
per.name=QString("sun_%1").arg(i+1);
-
out<
-
}
-
buffer.close();
-
-
-
-
QBuffer buf(&ba);
-
buf.open(QIODevice::ReadOnly);
-
-
QDataStream in(&buf);
-
for(int i=0;i<2;i++)
-
{
-
QPerson per;
-
in>>per;
-
qDebug()<"---"<
-
}
-
buf.close();
-
}
阅读(20046) | 评论(0) | 转发(0) |