Как отправить QSqlQueryModel через QTcpSocket с QDatastream? - PullRequest
0 голосов
/ 06 февраля 2020

Я хочу отправить 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.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Цель любого потомка QAbstractItemModel - принять некоторые данные в представления (виджеты), которые могут их представить.

Итак, в основном вы пытаетесь сделать что-то, что находится за пределами дизайна этого класса. Это как пытаться ударить по гвоздю лопатой. Это возможно, но опасно и не рекомендуется.

Просто прочитайте данные debase, используя QSqlQuery (используйте молоток), итерации по строкам чтения столбцов и сохраните их в некотором формате сериализации. Вы можете использовать QDataStream для этого:

    QDataStream out{&socket};

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

Возможно сделать это асинхронным.

1 голос
/ 11 февраля 2020

Вы не можете делать то, что хотите в Qt, или что-либо еще в этом отношении, не создавая "глубокую копию".

Если вы используете базу данных real , а не SQLite или некоторые другие. другой метод хранения нижнего уровня, который не использует ядро ​​базы данных, вы можете делать то, что вы хотите, не делая передачу. Прочтите временных таблиц для выбранной вами базы данных. Вы можете ВЫБРАТЬ В временную таблицу. Это гораздо эффективнее, потому что база данных с активным движком будет просто создавать курсор указателей, но обрабатывать его как настоящую таблицу. Если результирующий курсор слишком велик для оперативной памяти, он запишет его во временную временную область.

После этого ваш клиент скажет приложению сервера, чтобы УДАЛИТЬ строки, которые вы хотите удалить из временной таблицы, и ВСТАВИТЬ строки, которые вы хотите добавить. Просто убедитесь, что ваш сервер работает с временной таблицей с этого момента.

ПРИМЕЧАНИЕ: если вы работаете с очень плохим примером электронной таблицы, который связывает результат данных с электронной таблицей из потока GUI Вы не можете это исправить. Каждый официальный пример, который я нашел в Интернете, действительно плох. Никогда не выполняйте ввод-вывод базы данных в основном событии l oop.

Возможно, вы захотите получить копию этой книги . Он не будет содержать ответ на этот вопрос, но он содержит много примеров рабочих баз данных.

...