Russian Qt Forum
Ноябрь 24, 2024, 11:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Работа с большой базой данных  (Прочитано 15622 раз)
herbuz
Гость
« : Май 05, 2010, 21:07 »

Вообщем есть большая база данных мне нужно прочитать данные из таблицы быстро. т.е. так чтобы QSqlQueryModel не считывал все данные, а подгружал их порциями.слышал про QSqlQueryModel::fetchMore(), но кто-нить работал с этой функцией, нормально заюзать мне не удалось(работает не так как я понимаю)
Вобщем есть у кого какие соображения?
« Последнее редактирование: Май 06, 2010, 01:06 от herbuz » Записан
alexman
Гость
« Ответ #1 : Май 05, 2010, 22:14 »

Придется свои костыли изобретать Улыбающийся Можно сделать свою модель, которая читает нужные число строк из БД!
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #2 : Май 05, 2010, 22:19 »

Цитировать
QSqlQueryModel не считывал все данные, а подгружал их порциями
разве так само собой не происходит? Неужели QSqlQueryModel тянет все записи на клиента при обыкновенном "select"
Записан
alexman
Гость
« Ответ #3 : Май 05, 2010, 22:27 »

Цитировать
QSqlQueryModel не считывал все данные, а подгружал их порциями
разве так само собой не происходит? Неужели QSqlQueryModel тянет все записи на клиента при обыкновенном "select"
Изначально QSqlQueryModel тянет небольшую часть, но когда начинаем скроллировать, то QSqlQueryModel по мере скрола подгружает данные! Но в конце концов все данные оказываются в оперативке! Поправьте, если кто-нить обошел данную штуку!?
Записан
herbuz
Гость
« Ответ #4 : Май 05, 2010, 23:27 »

Цитировать
QSqlQueryModel не считывал все данные, а подгружал их порциями
разве так само собой не происходит? Неужели QSqlQueryModel тянет все записи на клиента при обыкновенном "select"
Изначально QSqlQueryModel тянет небольшую часть, но когда начинаем скроллировать, то QSqlQueryModel по мере скрола подгружает данные! Но в конце концов все данные оказываются в оперативке! Поправьте, если кто-нить обошел данную штуку!?
Да,разве так и делает? просто мне этого и нужно было!!!у меня рои коннекте к базе все подвисает просто!с дампом работает на ура, а к реальной базе...вобщем мне так и нужно чтоб по мере скрола данные подгружались!костыли не очень хочется писать, ибо долго и дебажить еще потом придется достаточно(
Записан
alexman
Гость
« Ответ #5 : Май 06, 2010, 07:53 »

Да,разве так и делает?
Так и делает!
Записан
herbuz
Гость
« Ответ #6 : Май 06, 2010, 09:38 »

хорошо, тогда как поменять объем данных, которые будут докачиваться?например, я хочу чтоб во время скроллинга докачивалось по 100 записей?это вообще можно поменять в QSqlModelQuery?или что вообще юзать нужно для этого, может что другое посоветуете?и потом, откуда Вы это узнали,что так и делает?
« Последнее редактирование: Май 06, 2010, 09:40 от herbuz » Записан
alexman
Гость
« Ответ #7 : Май 06, 2010, 10:11 »

хорошо, тогда как поменять объем данных, которые будут докачиваться?например, я хочу чтоб во время скроллинга докачивалось по 100 записей?
Поменять нельзя! Это жестко в коде зашито! Да и зачем?
Код:
#define QSQL_PREFETCH 255
...
void QSqlQueryModel::fetchMore(const QModelIndex &parent)
{
    Q_D(QSqlQueryModel);
    if (parent.isValid())
        return;
    d->prefetch(qMax(d->bottom.row(), 0) + QSQL_PREFETCH);
}

и потом, откуда Вы это узнали,что так и делает?
Попробуй простой пример! Таблица БД (~1000 записей), QSqlQueryModel для этой таблицы и QTableView. Потяни за скрол и увидешь как он лагает Подмигивающий Это все из-за подкачки!
Записан
herbuz
Гость
« Ответ #8 : Май 06, 2010, 11:05 »

Цитировать
Попробуй простой пример! Таблица БД (~1000 записей), QSqlQueryModel для этой таблицы и QTableView. Потяни за скрол и увидешь как он лагает Подмигивающий Это все из-за подкачки!
Лагать будет QTableView или QSqlQueryModel?
Записан
alexman
Гость
« Ответ #9 : Май 06, 2010, 12:22 »

Цитировать
Попробуй простой пример! Таблица БД (~1000 записей), QSqlQueryModel для этой таблицы и QTableView. Потяни за скрол и увидешь как он лагает Подмигивающий Это все из-за подкачки!
Лагать будет QTableView или QSqlQueryModel?
QTableView! Изначально загрузиться и отобразиться в view небольшая часть данных из БД . Когда будешь тянуть вертикальный скрол и "дойдешь" до конца, то в этот момент подгрузятся еще данные (вызовится fetchMore). В этот момент, так как данных станет больше, число позиций для скрол бара увеличится. Я про этот лаг (ИМХО корявая реализация)!
Записан
crossly
Гость
« Ответ #10 : Май 06, 2010, 14:12 »

согласен с последним оратором.... возможно нужно было получить количество строк таблицы и именно его использовать в качестве максимума для скролбара
Записан
BRE
Гость
« Ответ #11 : Май 06, 2010, 14:17 »

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

int QSqlQueryModel::rowCount ( const QModelIndex & parent = QModelIndex() ) const   [virtual]
Reimplemented from QAbstractItemModel::rowCount().

If the database supports returning the size of a query (see QSqlDriver::hasFeature()), the amount of rows of the current query is returned. Otherwise, returns the amount of rows currently cached on the client.

Записан
crossly
Гость
« Ответ #12 : Май 06, 2010, 14:53 »

ага.... только работает не везде... Улыбающийся
Записан
BRE
Гость
« Ответ #13 : Май 06, 2010, 14:57 »

ага.... только работает не везде... Улыбающийся
Ну тут уж... If the database supports...  Улыбающийся
Записан
alexman
Гость
« Ответ #14 : Май 06, 2010, 16:05 »

После setQuery можно вызвать
Код:
while (myModel->canFetchMore()) {
     myModel->fetchMore();
}
Тогда не будет проблем со скролом! Ну а если БД большая, то потребуется, видимо, свою модель делать!
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.