Отключить поведение предварительной выборки/кеширования QSql(Relational)TableModel

По какой-то (ну, по производительности) причине классы «модели» Qt извлекают из базы данных только 256 строк, поэтому, если вы хотите добавить строку в конец набора записей, вы, по-видимому, должны сделать что-то вроде строк

while (model->canFetchMore()) {
  model->fetchMore();
}

Это работает, и когда вы выполняете model->insertRow(model->rowCount()) после этого, строка действительно добавляется после последней строки recorset.

Существуют различные другие проблемы, связанные с этим поведением, например, когда вы вставляете или удаляете строки из модели, представление, которое отображает его, перерисовывается с отображением только 256 строк, и вы должны вручную убедиться, что отсутствующие строки снова извлекаются.

Есть ли способ полностью обойти это поведение? Моя модель вряд ли отобразит больше, чем, скажем, 1000 строк, но заставить ее извлекать эти 1000 строк кажется настоящей головной болью. Я понимаю, что это отличная оптимизация производительности, если вам приходится иметь дело с большими наборами записей, но для меня это скорее бремя, чем благо.

Модель должна быть доступна для записи, поэтому я не могу просто использовать QSqlQueryModel вместо QSqlRelationalTableModel.


person shylent    schedule 25.05.2012    source источник
comment
Читая документы на QSqlTableModel::insertRecord(int row, const QSqlRecord& record), я вижу Если строка отрицательна, запись будет добавлена ​​в конец. Таким образом, вместо использования model->rowCount() вы можете просто передать -1. Это что-то меняет в вашей проблеме?   -  person dschulz    schedule 26.05.2012


Ответы (1)


Из документации QSqlTableModel:

bool QSqlTableModel::insertRecord (int row, const QSqlRecord и запись)

Вставляет запись после строки. Если строка имеет отрицательное значение, запись будет добавлена ​​в конец. Внутренние вызовы insertRows() и setRecord().

Возвращает true, если строка может быть вставлена, иначе false.

См. также insertRows() и removeRows().

Я еще не пробовал, но думаю, что нет необходимости извлекать полный набор данных, чтобы вставить запись в конце.

person dschulz    schedule 26.05.2012
comment
Я понятия не имею, как я пропустил этот момент. Большое спасибо! Я постараюсь увидеть, действительно ли это работает так, как рекламируется. Если это так, это определенно поможет мне добавить строки в конец набора записей. - person shylent; 26.05.2012