#sql #qt #view #model
#sql #qt #Вид #Модель
Вопрос:
Пожалуйста, потерпите меня, поскольку это немного субъективный вопрос, но я ищу информированную передовую практику для того, что, вероятно, является распространенной ситуацией.
У меня есть данные, разделенные на несколько таблиц (sqlite), для управления которыми я использую Qt. Представление (sql) — это один из способов отображения данных из нескольких таблиц, но я хотел бы также иметь возможность обновлять значения. Давайте рассмотрим пример из трех таблиц, используя, скажем, дома. Три таблицы связаны с помощью внешних ключей, скажем, таблицы Area, таблицы House и таблицы Furniture. Существует соотношение 1: много, связанное с внешними ключами: Area: House, House: Furniture Я хотел бы, чтобы элемент пользовательского интерфейса с областями заполнял элемент пользовательского интерфейса House, который, в свою очередь, заполняет элемент пользовательского интерфейса Furniture. Под элементом пользовательского интерфейса я подразумеваю что-то вроде редактируемого списка или серии переходов строк / прядильщиков (зависит от типа значения), что угодно на самом деле.
просто чтобы немного прояснить, я понимаю, как использовать qsqlrelationaltablemodel и qsqlrelationdelegate. Они отлично работают, когда я обновляю одну таблицу, но не обновляют представление (sql), созданное из объединений в нескольких таблицах. Мне нужно решение, которое позволяет мне эффективно работать с данными из нескольких таблиц, включая обновление значений.
Должен ли я сделать это с тремя моделями, обновляя фильтр для каждой и используя представление, связанное с каждой моделью? Или, возможно, я мог бы вставить все в единую древовидную модель? Или мне следует подумать о создании пользовательской модели или, возможно, просто не использовать model / view и вручную заполнить пользовательский интерфейс?
Некоторое время назад я пытался использовать несколько моделей в одной базе данных в качестве эксперимента, и они не вели себя вместе так хорошо, как я надеялся. Это основная причина, по которой я спрашиваю о наилучшей практике.
Большое спасибо за любой совет, который вы можете предложить.
Комментарии:
1. Ваша модель кажется нормальной, типичная реляционная модель — но вы спрашиваете, как обновить одну таблицу на основе идентификаторов из другой?
2. Вы изучали QSqlRelationalTableModel? Я не совсем уверен, что вы подразумеваете под тем, что пользовательский интерфейс одной таблицы заполняет другую таблицу, заполняющую другую. Возможно, вы могли бы уточнить с более подробной информацией в вашем примере? Между реляционной моделью и делегатами в ваших представлениях, которые могут дать вам то, что вы ищете. Но опять же, это предположение, основанное на том, что я думаю , что вы говорите.
3. Привет. @M.R нет, я понимаю, как обновлять таблицу на основе идентификаторов из другой.
4. @реальный счет, спасибо, но я понимаю о qsqlrelationaltablemodel. я отредактирую вопрос, чтобы он был немного понятнее. прошу прощения за путаницу
5. Итак, не могли бы вы немного подробнее объяснить свой вопрос? потому что, по моему опыту, обновление всех таблиц по отдельности (в транзакции) приводит к улучшению целостности данных, лучшему обслуживанию и т.д.
Ответ №1:
Я думаю, мой вопрос был не таким ясным, как мог бы быть; а именно потому, что я действительно не знал, какой вопрос задать. Я искал способ представления данных из нескольких таблиц через отдельные элементы пользовательского интерфейса таким образом, чтобы это не обязательно отображалось непосредственно в tableview.
Пока что моим решением является использование отдельных моделей, заполняемых из базы данных вручную. Любое требуемое редактирование значений я выполняю вручную.
Кажется, пока все работает нормально. Один удобный совет, который я усвоил, заключается в том, чтобы поместить дополнительные данные в другую роль Qt::UserRole. Это означало, что я могу хранить соответствующие UUID (все мои ключи БД — это UUID) с данными в одном столбце treeview и использовать их для получения прямого доступа к БД. Дополнительные данные, по-видимому, можно поместить в Qt::UserRole n, хотя я этого еще не пробовал.