Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Jo от Декабрь 28, 2010, 18:10



Название: Модель и куча данных
Отправлено: Jo от Декабрь 28, 2010, 18:10
Кратко излагаю суть проблемы.
Имеется источник данных, который дает 100 000 строк в день.
Строки непрерывно сохраняются в базу SQLite.
Задача — дать пользователю возможность просмотра как истории данных, так и изменений данных в реальном времени.
Все это хочется реализовать в рамках концепции модель–представление средствами QT на С++.
Для работы с SQLite используется собственная обёртка.

Как это лучше сделать?


Название: Re: Модель и куча данных
Отправлено: Пантер от Декабрь 28, 2010, 18:17
Читай про QAbstractItemModel в ассистенте.


Название: Re: Модель и куча данных
Отправлено: Jo от Декабрь 28, 2010, 18:41
Мне просто не совсем понятна общая концепция для работы с базой.
А конкретнее реализация метода data модели.

Вьюха как я понимаю дергает этот метод модели каждый раз и (для каждой ячейки?) когда ей надо отобразить данные.

Т.е. надо каждый раз делать запрос к базе?


Название: Re: Модель и куча данных
Отправлено: UVV от Декабрь 28, 2010, 19:51
Т.е. надо каждый раз делать запрос к базе?

Кэшировать можешь, я думаю


Название: Re: Модель и куча данных
Отправлено: crossly от Декабрь 28, 2010, 20:51
по сути модель это связующее звено между источником данных и представлением... источником данных может быть что угодно(массив, sql запрос, просто текстовый файл и т.д.)... к примеру если у вас в качестве источника данных используется массив. представление спрашивает у модели данных для определенного индекса посредством вызова метода data... модель берет данные из массива по этому индексу и возвращает представлению... в случае с sql-запросом примерно то же самое, в простейшем случае
Код:
query.seek(index.row());
return query.value(index.column());
В вашем случае есть несколько вариантов ... к примеру писать данные в базу... затем оповещать модель от том что данные в базе изменились и ей надо повторно выполнить селект (либо делать селект просто по таймеру с определенным интервалом)... но я бы наверное пошел другим путем... отдавать данные непосредственно в модель... там их кэшировать и с определенным интервалом сбрасывать кэш на диск... в данном случае модель всегда будет знать о том что появились данные и не надо будет ее об этом информировать.... и + не нужно будет делать 100500 запросов к базе...


Название: Re: Модель и куча данных
Отправлено: Jo от Декабрь 28, 2010, 22:24
Так и думал сделать, но не понял вот чего: очищать ли кэш, после сброса данных в базу? Ведь если я его почищу то модель уже не будет знать о данных. Я правильно понял?

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

Хотелось бы так: есть 5000 000 строк + все время сыпятся новые.
Если пользователь находится на самой первой странице (условно она будет содержать самые новые данные), то данные должны как бы убегать от него переползая на следующие страницы. Но если пользователь отмотал несколько страниц назад, то на данной странице данные уже не должны смещаться..

Простой пример: Есть табла, в которой много записей и скрол рядом, если пользователь установил скрол на последний элемент, то вьюха должна автоскролить, но если юзер отмотал скрол вверх там уже автоскроллинг отключается.

Как то так...

Праильно вообще мыслю или нет?


Название: Re: Модель и куча данных
Отправлено: alexman от Декабрь 28, 2010, 23:33
но я бы наверное пошел другим путем... отдавать данные непосредственно в модель... там их кэшировать и с определенным интервалом сбрасывать кэш на диск... в данном случае модель всегда будет знать о том что появились данные и не надо будет ее об этом информировать.... и + не нужно будет делать 100500 запросов к базе...
Также вскоре надо будет реализовывать что-то подобное. Понятно, что если данных много и загружать их в оперативку, то это плохо кончится. Способ с загрузкой только тех данных, что нужны в данный момент времени хорош, но что делать если требуется еще и сортировать данные по каким либо критериям. Можно конечно строить индексы... Может кто-нить уже делал что-то подобное в связке с БД? Поделитесь опытом? :)


Название: Re: Модель и куча данных
Отправлено: crossly от Декабрь 29, 2010, 00:47
Цитировать
Ведь если я его почищу то модель уже не будет знать о данных. Я правильно понял?
после сброса кэш чистить и делать селект
Цитировать
но что делать если требуется еще и сортировать данные по каким либо критериям.
сортировать лучше средствами СУБД...


Название: Re: Модель и куча данных
Отправлено: alexman от Декабрь 29, 2010, 07:35
сортировать лучше средствами СУБД...
есть один недостаток: если сортировка займет много времени, то нет возможности показать никакого прогресса. или можно как-то выкрутится?


Название: Re: Модель и куча данных
Отправлено: Jo от Декабрь 29, 2010, 11:01
Вообще как я вижу, путей тут не сильно много. Рисовать либо из базы либо из кэша.

Тут в догонку у меня вопрос по QTableView правильно ли я понимаю, что Вьюха вызывает метод data модели только для тех ячеек которые надо перерисовать?

И еще, хранит ли въюха полученные значения от модели, или только рисует?


Название: Re: Модель и куча данных
Отправлено: Пантер от Декабрь 29, 2010, 11:05
Вообще как я вижу, путей тут не сильно много. Рисовать либо из базы либо из кэша.
Лучше все таки немного кешировать. Но ограничить кэш - хранить только n записей.

Тут в догонку у меня вопрос по QTableView правильно ли я понимаю, что Вьюха вызывает метод data модели только для тех ячеек которые надо перерисовать?
Да
И еще, хранит ли въюха полученные значения от модели, или только рисует?
Вьюха ничего не хранит.