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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как правильно организовать работу с SQLite?  (Прочитано 5090 раз)
bebabo
Гость
« : Сентябрь 10, 2008, 11:51 »

всем привет! изучаю работу в Qt с SQLite и есть несколько вопросов.
в общем, реализую следующее - есть база данных, в которой две таблицы - customers и trash. обе таблицы хранят одинаковые структуры с тем только отличием, что в первой - текущие заказчики, а во вторую помещаются те, которых удалили (для возможности восстановить).
таблицы привязаны к двум QTableView - сur_cust и trash_cust. при двойном клике на строке сur_cust открывается форма для редактирования данных заказчика, с возможностью удаления. в данный момент последнее реализовано у меня следующим образом:

Код:
customerform *page = (customerform*) ui.tabWidget->currentWidget();
QString name = page->ui.lineEdit->text();

QSqlQuery query;
query.prepare("SELECT contact, mail, fone FROM сustomers WHERE name = ?");
query.addBindValue(name);
query.exec();
   
QString contact, mail, fone;
while (query.next()) {
contact = query.value(0).toString();
mail = query.value(1).toString();
fone = query.value(2).toString();
}

query.prepare("INSERT INTO trash (name, contact, mail, fone) "
    "VALUES (?, ?, ?, ?)");
query.addBindValue(name);
query.addBindValue(contact);
query.addBindValue(mail);
query.addBindValue(fone);
query.exec();
   
query.prepare("DELETE FROM customers WHERE name = ?");
query.addBindValue(name);
query.exec();


можно ли реализовать все это красивее?) и как после изменений таблиц обновить QTableView? только лишь переподключением модели, или есть другой способ?
« Последнее редактирование: Сентябрь 10, 2008, 13:04 от pastor » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Сентябрь 10, 2008, 12:38 »

Цитировать
две таблицы - customers и trash. обе таблицы хранят одинаковые структуры с тем только отличием, что в первой - текущие заказчики, а во вторую помещаются те, которых удалили
Лучше сделать одну таблицу, + одно поле (0-неактивный заказчик, 1-активный заказчик)

Цитировать
как после изменений таблиц обновить QTableView?
лучше использовать QDataWidgetMapper для диалога настройки, тогда все будет обновлятся само
« Последнее редактирование: Сентябрь 10, 2008, 12:49 от lit-uriy » Записан

Юра.
bebabo
Гость
« Ответ #2 : Сентябрь 10, 2008, 14:35 »

спасибо за подсказку про QDataWidgetMapper (как-то я это пропустил)!
а насчет хранения всего в одной таблице - сначала так и хотел сделать, но остановил вот какой момент - получается, что при заполнении QTableView активных заказчиков (и при каждом ее обновлении), мне придется фильтровать неактивных, тогда как сейчас я просто назначаю одну таблицу одной вьюшке, другую - второй вьюшке.
Записан
ритт
Гость
« Ответ #3 : Сентябрь 10, 2008, 15:14 »

> одну таблицу одной вьюшке, другую - второй вьюшке.
ну и глупо. вдвойне глупо доказывать, что так лучше Улыбающийся

1) делаешь таблицу, например: id | name | active
2) натравливаешь на эту таблицу QSqlTableView
3) наследуешься от QSortFilterProxyModel и добавляешь enum MyFilter { ShowAll, ShowAciveOnly, ShowInactiveOnly }; и свойство MyFilter myFilter.
3.1) для каждого состояния свойства myFilter определяешь логику фильтрации (тупо myFilter == ShowAciveOnly && data(...).toBool())
3.2) скрываешь столец "active" модели-источника посредством filterAcceptsColumn
4) навешиваешь экземпляр QSqlTableView источником экземпляра твоей прокси с фильтром ShowAciveOnly, а эту проскю скармливаешь вьюхе
5) навешиваешь всё тот же экземпляр QSqlTableView источником второго экземпляра твоей прокси с фильтром ShowInaciveOnly, а эту вторую проскю скармливаешь второй вьюхе

а когда прикрутишь ещё и QDataWidgetMapper, тебе вообще ничего не потребуется делать, т.к. QDataWidgetMapper::submit() будет через любую проксю звать QSqlTableView::submit(), в ктором выполняется перевыбор данных при успешной отправке - прокси автоматически подхватят изменения а вьюхи отобразят содержимое, полученное через прокси

в конце-концов, ты на Qt пишешь, а не на вижуалвасике - так не уподобляйся всяческому отрёбью!
Записан
bebabo
Гость
« Ответ #4 : Сентябрь 11, 2008, 10:15 »

Константин, огромное спасибо! разобрался вчера с QSortFilterProxyModel - просто волшебная штука)
еще раз спасибо за ваш коммент)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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