Название: Как отобразить все записи из базы сразу, а не кэшируя их Отправлено: 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 это мегакостыль причем не производительный вообще, но можно попробовать сделать вот так
Код
Название: 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 заюзатьно для надёжности лучше всё же опрашивать специальную таблицу, а не проверять время изменения файла |