Russian Qt Forum

Qt => Базы данных => Тема начата: olegmar от Февраль 02, 2009, 17:42



Название: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: olegmar от Февраль 02, 2009, 17:42
Добрый день! Программа использует QTreeView, sqlite, QSqlTableModel. После того как она загружает базу с несколькими тысячами записей, то первоначально доступно 256, а остальные только после того, как вы подвигаете скроллбар.. Как можно этого избежать, чтобы показ всех записей происходил единовременно?


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: ритт от Февраль 02, 2009, 19:01
попинать автора склайт чтобы тот наконец уж реализовал поддержку query_size


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: olegmar от Февраль 02, 2009, 19:36
То есть никак это не побороть?  ???


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: spirit от Февраль 02, 2009, 20:23
это мегакостыль причем не производительный вообще, но можно попробовать сделать вот так
Код
C++ (Qt)
QSqlQueryModel *qmodel = new QSqlQueryModel;
qmodel->setQuery(...);
...
while (qmodel->canFetchMore())
    qmodel->fetchMore();
...
 


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: olegmar от Февраль 02, 2009, 21:26
Господа, спасибо вам за ответы!
spirit, сделал, как вы и посоветовали - результат превосходный!


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: ритт от Февраль 02, 2009, 21:34
для нескольких тысяч записей превосходный результат? :)
каждому своё, конечно...


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: olegmar от Февраль 18, 2009, 08:40
Программа рассчитана для работы на компах Intel Core Quadro, 4 гига оперативы, видео geforce 9600 - работает просто отлично даже с 10000 записей, хотя на данный момент всего 158)


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: BRE от Февраль 18, 2009, 08:57
Программа рассчитана для работы на компах Intel Core Quadro, 4 гига оперативы, видео geforce 9600 - работает просто отлично даже с 10000 записей, хотя на данный момент всего 158)
Так может лучше вместо SQLite что-то по серьезней использовать? Что-бы сразу без костылей...
Серьезное железо, наверное, серьезная задача. Почему Lite?


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: olegmar от Февраль 18, 2009, 16:35
задача, честно говоря, не серьёзная) Прохожу сейчас практику в Хозяйственном суде, в котором ввели новую процедуру посредничества. Непосредственный начальник и остальные посредники попросили написать небольшую программку для учёта данных по посредничествам. На сервер лезть не хочется, потому что там всё на соплях, да ещё и Оракл стоит, боюсь, что если что поломаю, то меня убьют быстро, а так для их нужд вполне достаточно и они довольны. Программу почти закончил, сейчас занимаюсь пользовательским интерфейсом.


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: ритт от Февраль 18, 2009, 16:46
тем-более встроил бы птица! - производительность заметно выше, а удобств столько же :)


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: olegmar от Февраль 18, 2009, 17:18
Да я бы с радостью, но говорю же вам что в серверной чихнёшь - всё и упадёт)) и это не шутка, всё работает через одно место.

У меня вот ещё каких два вопроса, немного не по теме, возникшие после перехода на Qt 4.5rc1:

использую QTreeView, QSqlTableModel. В таблице, скажем, 150 записей и все они, естественно, на экране не помещаются. Я, для примера, прокрутил список вниз, в самый конец таблицы, и тут мне захотелось добавить запись - вызываю окно, добавляю. (1):Обновляю базу - здесь первый вопрос - запись добавляется, но обновление в таблице не происходит вплоть до перезапуска программы. Приходится загружать файл с базой заново. Нет ли какого сигнала, при получении которого я знал бы, что надо обновить содержимое таблицы?

И второй вопрос - после обновления записей в таблице вышеописанным образом, положение в таблице сбивается и перескакивает в начало списка. Чтобы избежать этого прыжка в начало - я делаю так:

Код:
connect(treeView->verticalScrollBar(),SIGNAL(sliderMoved(int)),this,SLOT(sliderMoved(int)));

В sliderMoved я запоминаю текущее положение скроллбара, и после обновления таблицы пытаюсь его восстановить :

Код:
treeView->verticalScrollBar()->setSliderPosition(currentBarPosition);

и, в принципе, всё это работает, НО лишь в том случае, если был перемещён ползунок скроллбара, а вот в случае если список прокручивался колесом мыши - нет. Пробовал баловаться с value и setValue - вообще не работает... В чём может быть загвоздка, не подскажете?


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: ритт от Февраль 18, 2009, 17:35
Да я бы с радостью, но говорю же вам что в серверной чихнёшь - всё и упадёт)) и это не шутка, всё работает через одно место.
Firebird mbedded. в серверную ходить не придётся )

мне захотелось добавить запись - вызываю окно, добавляю. (1):Обновляю базу - здесь первый вопрос - запись добавляется, но обновление в таблице не происходит вплоть до перезапуска программы. Приходится загружать файл с базой заново. Нет ли какого сигнала, при получении которого я знал бы, что надо обновить содержимое таблицы?
почему бы не добавлять запись сразу через QTreeView/QSqlTableModel?


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: olegmar от Февраль 18, 2009, 17:44
Это при помощи метода insertRecord у QSqlTableModel, я правильно понимаю?

п.с. спасибо вам за помощь огромное!


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: ритт от Февраль 18, 2009, 18:00
можно и insertRecord у QSqlTableModel. главное, что в таком случае модель сама знает, что нужно обновить данные из бд после записи.
только не забывать делать submitAll, если политика обновления не автоматическая.


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: olegmar от Февраль 18, 2009, 19:53
уважаемый Константин, попробовал я использовать insertRecord :)
Сразу возникло несколько вопросов: с добавлением понятно - работает отлично, а вот как с редактированием уже существующей записи? Я так понимаю, чтобы изменить существующую запись я должен изменять запись по параметру row? Пока ещё не пробовал - сейчас надо бежать домой.

И второй самый главный вопрос - одним из условий работы программы был принцип одновременной работы с файлом-базой нескольких пользователей одновременно, то есть если один добавляет запись, второй сразу же её видит. Всё работало, а вот сейчас при использовании insertRecord не работает. Может посоветуете какое-нибудь решение? :)

Ещё раз хотел бы вас поблагодарить!


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: Rcus от Февраль 18, 2009, 20:01
Цитировать
И второй самый главный вопрос - одним из условий работы программы был принцип одновременной работы с файлом-базой нескольких пользователей одновременно
Мы точно о SQLite говорим?
http://sqlite.org/whentouse.html
Цитировать
A good rule of thumb is that you should avoid using SQLite in situations where the same database will be accessed simultaneously from many computers over a network filesystem.


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: Пантер от Февраль 18, 2009, 21:05
Всё работало, а вот сейчас при использовании insertRecord не работает. Может посоветуете какое-нибудь решение? :)
submintAll()


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: ритт от Февраль 18, 2009, 21:55
я ж писал:
Цитировать
только не забывать делать submitAll, если политика обновления не автоматическая.

склайт для одновременного доступа не подходит - ещё один плюс в пользу файрбёрда.
о событиях уведомлять не умеет - ещё один плюс в пользу файрбёрда.
итог: тебе нужен Firebird Embedded - как собрать и использовать ищи в соответствующих ветках форума

без уведомлений о событиях можно обойтись периодическим перезапросом данных (опционально парой триггеров в бд и таблиицей изменений для клиентов) - это также уже обсуждалось...


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: olegmar от Февраль 18, 2009, 22:53
submitAll()
это всё понятно, я говорил про то, что результат не отображается на других копиях программы.. Но дело не в этом - скажите Firebird Embedd - это драйвер QIBASE? Если - да, то насколько я понимаю мне сильно придётся менять все обращения к базу данных? И возможно ли в нём подключаться одновременно нескольким клиентам к одному файлу?

спасибо большое всем за ответы!



Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: Rcus от Февраль 19, 2009, 00:52
http://www.ibase.ru/ibfaq.htm
Говорит что Embedded не подходит для многопользовательского доступа. Хм?


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: Пантер от Февраль 19, 2009, 07:39
Скюлайт нормально работает с несколькими клиентами, проверено. За несколько месяцев использования пятью клиентами проблем не было. А на счет обновления данных.... Заведи таблицу, где будешь отмечать последнее изменение, и дергай ее периодически из клиентов. Если время обновления больше, чем сохраненное, то обновиться. В принципе можно попробовать через QFileInfo смотреть дату у файла. :)


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: olegmar от Февраль 19, 2009, 14:30
Цитировать
В принципе можно попробовать через QFileInfo смотреть дату у файла.

Не поверите, но так и делаю)

Тоже прочитал на http://www.ibase.ru/ibfaq.htm, что нет возможности одновременнной работы нескольких пользователей, поэтому и решил уточнить.


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: ритт от Февраль 19, 2009, 17:01
В принципе можно попробовать через QFileInfo смотреть дату у файла.
можно QFileSystemWatcher заюзать

но для надёжности лучше всё же опрашивать специальную таблицу, а не проверять время изменения файла


Название: Re: Как отобразить все записи из базы сразу, а не кэшируя их
Отправлено: Пантер от Февраль 19, 2009, 18:09
В принципе можно попробовать через QFileInfo смотреть дату у файла.
можно QFileSystemWatcher заюзать

но для надёжности лучше всё же опрашивать специальную таблицу, а не проверять время изменения файла
С таблицей есть одно но - разрастется код, так как нужно будет при каждом изменении дополнительно изменять данные в этой табличке и заводить транзакцию.