Russian Qt Forum
Ноябрь 24, 2024, 01:00
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Кладовая готовых решений
(Модератор:
Пантер
) >
Вопрос сохранения данных.
Страниц: [
1
]
2
3
...
5
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Вопрос сохранения данных. (Прочитано 31941 раз)
nata267
Гость
Вопрос сохранения данных.
«
:
Июнь 19, 2012, 12:16 »
Допустим я проектирую программу-редактор чегото там. У меня в интерфейсе программы есть окошко типа QDockWidget+QTreeView, где пользователь будет формировать древовидную структуру чегото там с помощью кнопок "Добавить узел такого-то типа", "Удалить", "Переименовать", "Переместить" и т.д. Когда мы щелкаем на созданный узел в другое окошко загружается содержимое этого узла. Допустим это форма с элементами типа: текстовое поле, картинка, видео, аудио файл. Эти элементы можно двигать на форме, менять размер. БД, где все это хранится после сохранения пользователем путь будет MYSQL.
Вопрос заключается в том. Как организовать хранение всех изменений и сохранения общего изменившегося состояния в БД по кнопке главного меню "Сохранить"? Если бы можно было сохранять только изменения формы это была бы простая задача. Но как быть с древовидной структурой? Я дала упрощенное описание программы. На самом деле она намного сложнее, там куча окошек с различными данными которые изменяет пользователь. Все изменения фиксируются в базе где куча взаимосвязанных таблиц. Как делать общее сохранение данных по кнопке сохранить?? Какие есть варианты решения данной задачи?? И еще вопрос. Является ли это архитектурной задачей?? И стоит ли её рассматриваить и выделять отдельную ветку для решения архитектурных задач?
«
Последнее редактирование: Июнь 19, 2012, 12:20 от nata267
»
Записан
Bepec
Гость
Re: Вопрос сохранения данных.
«
Ответ #1 :
Июнь 19, 2012, 12:30 »
Кхм. А сохранить всю базу, религия не позволяет?
Записан
alexis031182
Гость
Re: Вопрос сохранения данных.
«
Ответ #2 :
Июнь 19, 2012, 12:33 »
Цитата: Bepec от Июнь 19, 2012, 12:30
Кхм. А сохранить всю базу, религия не позволяет?
undo/redo хранят на время одной сессии работы приложения. В БД держать это ни к чему.
Записан
alexis031182
Гость
Re: Вопрос сохранения данных.
«
Ответ #3 :
Июнь 19, 2012, 12:45 »
Цитата: nata267 от Июнь 19, 2012, 12:16
Как делать общее сохранение данных по кнопке сохранить??
Как обычно. Пройтись по списку виджетов и сохранить их текущее состояние в БД.
Цитата: nata267 от Июнь 19, 2012, 12:16
Какие есть варианты решения данной задачи??
Я бы сделал через медиатор + классы, хранящие состояние виджетов. Только медиатор должен быть Медиатором в данном случае, а не простым контейнером перекрёстных ссылок. Медиатор сам реализует логику, и не должен использоваться в роли пассивного участника событий.
Цитата: nata267 от Июнь 19, 2012, 12:16
И еще вопрос. Является ли это архитектурной задачей?? И стоит ли её рассматриваить и выделять отдельную ветку для решения архитектурных задач?
Страшное слово. Не загоняйте себя в рамки. Задача как задача, не более и не менее архитектурна, нежели другие.
Записан
nata267
Гость
Re: Вопрос сохранения данных.
«
Ответ #4 :
Июнь 19, 2012, 13:09 »
Цитата: alexis031182 от Июнь 19, 2012, 12:45
Цитата: nata267 от Июнь 19, 2012, 12:16
Как делать общее сохранение данных по кнопке сохранить??
Как обычно. Пройтись по списку виджетов и сохранить их текущее состояние в БД.
Это очень хорошо, но тогда есть вопросы. Во-первых, в базе храняться несколько проектов. Их пользователь открывает по кнопке допустим "Открыть проект". В этом случае предыдущий проект должен быть сохранен и закрыт. То есть вы предлагаете при сохранении стереть в базе данных всю информация касающуюся этого проекта и занести целиком новую во все таблицы или как?? Там куча взаимосвязанных таблиц. и куча данных по проекту. Изменение проекта за один сеанс работы с ним может быть как незначительным, так и кардинально меняющим вообще всю структуру проекта. И в том и в том случае придется сгененрировать и запустить кучу запросов? Это разве рационально?? Или вы имеете ввиду помечать элементы бд статусами deleted, inserted, modified. Поясните пожалуйста??
«
Последнее редактирование: Июнь 19, 2012, 13:15 от nata267
»
Записан
nata267
Гость
Re: Вопрос сохранения данных.
«
Ответ #5 :
Июнь 19, 2012, 13:19 »
Цитата: alexis031182 от Июнь 19, 2012, 12:45
Цитата: nata267 от Июнь 19, 2012, 12:16
Какие есть варианты решения данной задачи??
Я бы сделал через медиатор + классы, хранящие состояние виджетов. Только медиатор должен быть Медиатором в данном случае, а не простым контейнером перекрёстных ссылок. Медиатор сам реализует логику, и не должен использоваться в роли пассивного участника событий.
Если я не ошибаюсь,то вы предлагаете наследовать все элементы, хранящиеся в бд от одного класса например DBObject. и медиатор, хранящий ссылки на все эти объекты, медиатор проходит по объектам и смотрит их состояние (inserted, modified, deleted) и в зависимости от этого выполняется запрос к базе??? Правда в этом случае это уже не медиатор, а итератор)) Но там очень много иерархических и взаимосвязанных по id структур( Id генерируются при вставке в бд автоматически). Как быть с их удалением, вставкой?
«
Последнее редактирование: Июнь 19, 2012, 13:44 от nata267
»
Записан
nata267
Гость
Re: Вопрос сохранения данных.
«
Ответ #6 :
Июнь 19, 2012, 13:35 »
Цитата: alexis031182 от Июнь 19, 2012, 12:45
Цитата: nata267 от Июнь 19, 2012, 12:16
И еще вопрос. Является ли это архитектурной задачей?? И стоит ли её рассматриваить и выделять отдельную ветку для решения архитектурных задач?
Страшное слово. Не загоняйте себя в рамки. Задача как задача, не более и не менее архитектурна, нежели другие.
К какому же существующему разделу на этом форуме можно отнести эту тему?
Записан
nata267
Гость
Re: Вопрос сохранения данных.
«
Ответ #7 :
Июнь 19, 2012, 13:39 »
Цитата: alexis031182 от Июнь 19, 2012, 12:45
Только медиатор должен быть Медиатором в данном случае, а не простым контейнером перекрёстных ссылок. Медиатор сам реализует логику, и не должен использоваться в роли пассивного участника событий.
Почему он не должен быть простым контейнером перекрестных ссылок? И как он должен реализовывать логику? И почему медиатор, а не итератор?? Вообще не могу себе представить ваш медиатор. Что он вообще делает??
«
Последнее редактирование: Июнь 19, 2012, 13:45 от nata267
»
Записан
Bepec
Гость
Re: Вопрос сохранения данных.
«
Ответ #8 :
Июнь 19, 2012, 13:47 »
http://ru.wikipedia.org/wiki/
Медиатор
Записан
nata267
Гость
Re: Вопрос сохранения данных.
«
Ответ #9 :
Июнь 19, 2012, 13:57 »
Цитата: Bepec от Июнь 19, 2012, 13:47
http://ru.wikipedia.org/wiki/
Медиатор
)) не волнуйтесь, я знаю что такое медиатор. мне интересно как он реализован в контексте данной задачи. классы, хранящие состояние виджетов знают о нем, он знает о них. вопрос. что он делает? и что собой представляют эти классы, хранящие состояние виджетов? по идее через медиатор они должны обмениваться сообщениями. какими именно сообщениями могут обмениваться ваши классы, хранящие состояние виджетов? зачем им вообще обмениваться сообщениями?
«
Последнее редактирование: Июнь 19, 2012, 14:03 от nata267
»
Записан
alexis031182
Гость
Re: Вопрос сохранения данных.
«
Ответ #10 :
Июнь 19, 2012, 14:09 »
Цитата: nata267 от Июнь 19, 2012, 13:09
Это очень хорошо, но тогда есть вопросы. Во-первых, в базе храняться несколько проектов. Их пользователь открывает по кнопке допустим "Открыть проект". В этом случае предыдущий проект должен быть сохранен и закрыт. То есть вы предлагаете при сохранении стереть в базе данных всю информация касающуюся этого проекта и занести целиком новую во все таблицы или как?? Там куча взаимосвязанных таблиц. и куча данных по проекту. Изменение проекта за один сеанс работы с ним может быть как незначительным, так и кардинально меняющим вообще всю структуру проекта. И в том и в том случае придется сгененрировать и запустить кучу запросов? Это разве рационально?? Или вы имеете ввиду помечать элементы бд статусами deleted, inserted, modified. Поясните пожалуйста??
А почему нерационально? Только конечно в БД следует вносить изменения только в те записи, виджеты которых реально изменились. А за фактом изменения каждого конкретного виджета должен следить медиатор.
Записан
nata267
Гость
Re: Вопрос сохранения данных.
«
Ответ #11 :
Июнь 19, 2012, 14:12 »
Цитата: alexis031182 от Июнь 19, 2012, 14:09
Цитата: nata267 от Июнь 19, 2012, 13:09
Это очень хорошо, но тогда есть вопросы. Во-первых, в базе храняться несколько проектов. Их пользователь открывает по кнопке допустим "Открыть проект". В этом случае предыдущий проект должен быть сохранен и закрыт. То есть вы предлагаете при сохранении стереть в базе данных всю информация касающуюся этого проекта и занести целиком новую во все таблицы или как?? Там куча взаимосвязанных таблиц. и куча данных по проекту. Изменение проекта за один сеанс работы с ним может быть как незначительным, так и кардинально меняющим вообще всю структуру проекта. И в том и в том случае придется сгененрировать и запустить кучу запросов? Это разве рационально?? Или вы имеете ввиду помечать элементы бд статусами deleted, inserted, modified. Поясните пожалуйста??
А почему нерационально? Только конечно в БД следует вносить изменения только в те записи, виджеты которых реально изменились. А за фактом изменения каждого конкретного виджета должен следить медиатор.
вот я и справшиваю. как реализован ваш медиатор в контексте данной задачи. классы, хранящие состояние виджетов знают о нем, он знает о них. вопрос. что он делает? и что собой представляют эти классы, хранящие состояние виджетов? по идее через медиатор они должны обмениваться сообщениями. какими именно сообщениями могут обмениваться ваши классы, хранящие состояние виджетов? зачем им вообще обмениваться сообщениями? если нужен обход, то это итератор, а не медиатор, а ваш медиатор я не представляю себе его никаак
Записан
alexis031182
Гость
Re: Вопрос сохранения данных.
«
Ответ #12 :
Июнь 19, 2012, 14:17 »
Цитата: nata267 от Июнь 19, 2012, 13:19
Если я не ошибаюсь,то вы предлагаете наследовать все элементы, хранящиеся в бд от одного класса например DBObject.
Нет. Виджеты как были так и пусть будут. Не надо никаких их наследований.
Цитата: nata267 от Июнь 19, 2012, 13:19
и медиатор, хранящий ссылки на все эти объекты
Так точно.
Цитата: nata267 от Июнь 19, 2012, 13:19
, медиатор проходит по объектам и смотрит их состояние (inserted, modified, deleted) и в зависимости от этого выполняется запрос к базе???
Нет. Каждый виджет должен сам информировать медиатор о своих изменениях.
Цитата: nata267 от Июнь 19, 2012, 13:19
Правда в этом случае это уже не медиатор, а итератор)) Но там очень много иерархических и взаимосвязанных по id структур( Id генерируются при вставке в бд автоматически). Как быть с их удалением, вставкой?
Ну вот смотрите. У Вас имеется набор виджетов. Каждый виджет при изменении отправляет в медиатор событие, что изменилось: НАИМЕНОВАНИЕ_ПАРАМЕТРА, ЗНАЧЕНИЕ_ПАРАМЕТРА.
Медиатор, прекрасно представляя, собственно, от кого пришёл очередной посыл, создаёт объект класса состояния виджета для истории (стек), куда и заносит эту информацию. Соответственно, если хоть одно событие по какому-то виджету подобного рода медиатор получил, значит медиатор ставит этому виджету флаг - ИЗМЕНЁННЫЙ.
Далее, думаю, ясно.
Записан
alexis031182
Гость
Re: Вопрос сохранения данных.
«
Ответ #13 :
Июнь 19, 2012, 14:18 »
Цитата: nata267 от Июнь 19, 2012, 13:35
К какому же существующему разделу на этом форуме можно отнести эту тему?
Это конечно не в кладовой. "Общие вопросы" наверное единственный вариант.
Записан
alexis031182
Гость
Re: Вопрос сохранения данных.
«
Ответ #14 :
Июнь 19, 2012, 14:20 »
Цитата: nata267 от Июнь 19, 2012, 13:57
)) не волнуйтесь, я знаю что такое медиатор. мне интересно как он реализован в контексте данной задачи. классы, хранящие состояние виджетов знают о нем, он знает о них. вопрос. что он делает? и что собой представляют эти классы, хранящие состояние виджетов? по идее через медиатор они должны обмениваться сообщениями. какими именно сообщениями могут обмениваться ваши классы, хранящие состояние виджетов? зачем им вообще обмениваться сообщениями?
Медиатор хранит не только указатели на объекты виджетов, но и указатели на объекты классов состояний виджетов, которых, в случае необходимости, может быть своя, параллельная виджетам иерархия.
Записан
Страниц: [
1
]
2
3
...
5
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...