如何使用 QDatastream 通过 QTcpSocket 发送 QSqlQueryModel?



我想将QSqlQueryModel发送到另一个带有QDatastream和QTcpSocket的客户端。我想删除一些行并向 QSqlQueryModel 添加一些额外的行(不更改数据库(并将其发送到客户端,如下所示:

QTcpSocket socket;
socket.setSocketDescriptor(handle);
socket.waitForReadyRead(WAIT_TIME);
QByteArray req = socket->readAll();
QDataStream reqstream(&req,QIODevice::ReadOnly);
QSqlQueryModel MyModel;
....
// fetch data with MyModel
// add/remove some rows from that model without adding/removing them from actual database
....
QByteArray res;
QDataStream resstream(&res,QIODevice::WriteOnly);
resstrem << MyModel;
socket.write(res);

如何在不创建新的模型深层副本的情况下实现这一点。在客户端,它应该只接收带有数据的模型,以便我可以在 QML 中显示它。

QAbstractItemModel 的任何后代的目的都是将一些数据用于可以呈现它们的视图(小部件(。

所以基本上你正在尝试做一些在此类设计之外的事情。这就像试图用铲子敲钉子一样。这是可能的,但很危险,不建议这样做。

只需使用QSqlQuery(使用 hammer(读取 debasedata 遍历一行读取列并以某种序列化格式存储它们。您可以使用QDataStream

QDataStream out{&socket};
QSqlQuery query{"SELECT country FROM artist"};
while (query.next()) {
out << query.value(0).toString();
}

可以使其异步。

如果不创建"深度副本",你就无法在Qt或其他任何事情中做你想做的事情。

如果您使用的是真正的数据库,而不是SQLite或其他不使用数据库引擎的低端存储方法,则可以在不进行传输的情况下执行所需的操作。读取所选数据库的临时表。您可以选择进入临时表。这要高效得多,因为具有活动引擎的数据库只会创建指针游标,但将其视为真实表。如果生成的光标对于 RAM 来说太大,它会将其写入某个临时暂存区域。

之后,只需让您的客户端告诉服务器应用程序删除要从临时表中删除的行并插入要添加的行即可。只需确定您的服务器从那时起在临时表上运行即可。

注意:如果您正在使用一个非常糟糕的电子表格示例,该示例将数据结果从 GUI 线程中绑定到电子表格,则无法解决此问题。我在网上找到的每个官方例子都非常糟糕。永远不要在主事件循环中执行数据库 I/O。

你可能也想得到这本书的副本。它不会包含这个问题的答案,但它确实包含许多工作数据库示例。

最新更新