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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Модель и куча данных  (Прочитано 5638 раз)
Jo
Гость
« : Декабрь 28, 2010, 18:10 »

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

Как это лучше сделать?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 28, 2010, 18:17 »

Читай про QAbstractItemModel в ассистенте.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Jo
Гость
« Ответ #2 : Декабрь 28, 2010, 18:41 »

Мне просто не совсем понятна общая концепция для работы с базой.
А конкретнее реализация метода data модели.

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

Т.е. надо каждый раз делать запрос к базе?
« Последнее редактирование: Декабрь 28, 2010, 18:43 от Jo » Записан
UVV
Гость
« Ответ #3 : Декабрь 28, 2010, 19:51 »

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

Кэшировать можешь, я думаю
Записан
crossly
Гость
« Ответ #4 : Декабрь 28, 2010, 20:51 »

по сути модель это связующее звено между источником данных и представлением... источником данных может быть что угодно(массив, sql запрос, просто текстовый файл и т.д.)... к примеру если у вас в качестве источника данных используется массив. представление спрашивает у модели данных для определенного индекса посредством вызова метода data... модель берет данные из массива по этому индексу и возвращает представлению... в случае с sql-запросом примерно то же самое, в простейшем случае
Код:
query.seek(index.row());
return query.value(index.column());
В вашем случае есть несколько вариантов ... к примеру писать данные в базу... затем оповещать модель от том что данные в базе изменились и ей надо повторно выполнить селект (либо делать селект просто по таймеру с определенным интервалом)... но я бы наверное пошел другим путем... отдавать данные непосредственно в модель... там их кэшировать и с определенным интервалом сбрасывать кэш на диск... в данном случае модель всегда будет знать о том что появились данные и не надо будет ее об этом информировать.... и + не нужно будет делать 100500 запросов к базе...
Записан
Jo
Гость
« Ответ #5 : Декабрь 28, 2010, 22:24 »

Так и думал сделать, но не понял вот чего: очищать ли кэш, после сброса данных в базу? Ведь если я его почищу то модель уже не будет знать о данных. Я правильно понял?

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

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

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

Как то так...

Праильно вообще мыслю или нет?
Записан
alexman
Гость
« Ответ #6 : Декабрь 28, 2010, 23:33 »

но я бы наверное пошел другим путем... отдавать данные непосредственно в модель... там их кэшировать и с определенным интервалом сбрасывать кэш на диск... в данном случае модель всегда будет знать о том что появились данные и не надо будет ее об этом информировать.... и + не нужно будет делать 100500 запросов к базе...
Также вскоре надо будет реализовывать что-то подобное. Понятно, что если данных много и загружать их в оперативку, то это плохо кончится. Способ с загрузкой только тех данных, что нужны в данный момент времени хорош, но что делать если требуется еще и сортировать данные по каким либо критериям. Можно конечно строить индексы... Может кто-нить уже делал что-то подобное в связке с БД? Поделитесь опытом? Улыбающийся
Записан
crossly
Гость
« Ответ #7 : Декабрь 29, 2010, 00:47 »

Цитировать
Ведь если я его почищу то модель уже не будет знать о данных. Я правильно понял?
после сброса кэш чистить и делать селект
Цитировать
но что делать если требуется еще и сортировать данные по каким либо критериям.
сортировать лучше средствами СУБД...
Записан
alexman
Гость
« Ответ #8 : Декабрь 29, 2010, 07:35 »

сортировать лучше средствами СУБД...
есть один недостаток: если сортировка займет много времени, то нет возможности показать никакого прогресса. или можно как-то выкрутится?
Записан
Jo
Гость
« Ответ #9 : Декабрь 29, 2010, 11:01 »

Вообще как я вижу, путей тут не сильно много. Рисовать либо из базы либо из кэша.

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

И еще, хранит ли въюха полученные значения от модели, или только рисует?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Декабрь 29, 2010, 11:05 »

Вообще как я вижу, путей тут не сильно много. Рисовать либо из базы либо из кэша.
Лучше все таки немного кешировать. Но ограничить кэш - хранить только n записей.

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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