crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

kibsoft
  опции профиля:
сообщение 11.2.2010, 22:08
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Как искать например строку в модели? Перебирать строки? setFilter()?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 18)
Litkevich Yuriy
  опции профиля:
сообщение 11.2.2010, 22:16
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


а каковы условия поиска? Может выгоднее озадачить этим СУБД?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 11.2.2010, 22:21
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Именно в QSqlTableModel? Ведь работа с QSqlTableModel подразумевает работу с БД, у которой как раз одно из предназначений - поиск данных.
Если именно в QSqlTableModel, то есть:
Цитата(QtAssistant)
QModelIndexList QAbstractItemModel::match ( const QModelIndex & start, int role, const QVariant & value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags( Qt::MatchStartsWith | Qt::MatchWrap ) ) const [virtual]

Returns a list of indexes for the items in the column of the start index where the data stored under the given role matches the specified value. The way the search is performed is defined by the flags given. The list that is returned may be empty.

The search starts from the start index, and continues until the number of matching data items equals hits, the search reaches the last row, or the search reaches start again, depending on whether MatchWrap is specified in flags. If you want to search for all matching items, use hits = -1.

By default, this function will perform a wrapping, string-based comparison on all items, searching for items that begin with the search term specified by value.

Note: The default implementation of this function only searches columns, This function can be reimplemented to include other search behavior.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 11.2.2010, 22:27
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Ну если я например уже заполнил модель всей таблицей, зачем мне делать поиск средствами СУБД(работать дольше будет), если все это есть в оперативке? Или я что-то не так понимаю?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 11.2.2010, 23:05
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


ХЗ в общем, надо от гуру услышать ответ (:
Насчет работы QAbstractItemModel::match() для SQL-моделей(QSqlQueryModel, QSqlTableModel...). Могут быть такие грабли: для некоторых БД тянутся не все данные, а только первые 255 записей, остальное загружается по мере надобности (так называемое ленивое заполнение). Так из-за этого при работе с match() можно получить не то, что ожидалось (не полный объем). Для закачки всех данных используют:
while (model->canFetchMore())
        model->fetchMore();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.2.2010, 23:28
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kibsoft @ 12.2.2010, 1:27) *
Ну если я например уже заполнил модель всей таблицей, зачем мне делать поиск средствами СУБД
из соображений быстроты, дело в том, что в СУБД, если БД спроектирована корректно, уже построены индексы. А в программе нет. Я пробовал делать вообще простую вещь, разрешать сортировку по столбцам в представлении. А таблица в БД содержала несколько сот тысяч записей. И при первом показе таблица программа задумывалась почти на минуту.

Цитата(MoPDoBoPoT @ 12.2.2010, 2:05) *
Так из-за этого при работе с match() можно получить не то, что ожидалось (не полный объем).
хорошее замечание.
Цитата(MoPDoBoPoT @ 12.2.2010, 2:05) *
Для закачки всех данных используют:
если их много то ПО сожрёт кучу памяти.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 21.5.2010, 12:29
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


кстати вопрос довольно интересный. Если нужно последовательно искать вхождения в каком то поле таблицы, чего предпринять ? В любом тексте электоронного документа мы шаримся по мере нахождения нужного вхождения. Как это сделать в базе, ума не приложу. В почти покойных dbf сначала первое вхождение искали по seek, потом как кому фантазия подскажет, но все равно перебором. Я решения нормального не знаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.5.2010, 13:36
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


maint, нормальное решение заключается в том, чтобы каждый инструмент делал только ему предназначенную работу. Поиск должна выполнять СУБД.
У многих СУБД найдутся способы поиска подстроки, например:
SELECT ... WHERE foo [LIKE | CONTAINING | STARTING]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 21.5.2010, 15:04
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 21.5.2010, 19:36) *
maint, нормальное решение заключается в том, чтобы каждый инструмент делал только ему предназначенную работу. Поиск должна выполнять СУБД.
У многих СУБД найдутся способы поиска подстроки, например:
SELECT ... WHERE foo [LIKE | CONTAINING | STARTING]

кстати, не могу сообразить или плохо искал. Как встать в модели на запись с ключом, ну скажем 30. Именно ключ, а не номер по порядку.

like хорош очень. Но не всегда хорошо с кириллицей. В sqlite3 точно фигня. У меня ощущение, что upper и lower - просто в качестве заглушки стоят :). Сообразил, что можно не выбирать кучу записей, а только первую попавшуюся и искать начиная с какого то ключа
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.5.2010, 17:46
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(maint @ 21.5.2010, 19:04) *
Как встать в модели на запись с ключом, ну скажем 30
а её может и не быть в модели в данный момент
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 22.5.2010, 3:49
Сообщение #11


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 21.5.2010, 23:46) *
Цитата(maint @ 21.5.2010, 19:04) *
Как встать в модели на запись с ключом, ну скажем 30
а её может и не быть в модели в данный момент

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

вдогонку, функция интерактивного-визуального поиска в довольно часто используется в работе с базами данных. Т.е побоку SQL остается обычный перебор. Даже без seek как в DBASE IV. Прогресс однако ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.5.2010, 5:05
Сообщение #12


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(maint @ 22.5.2010, 7:49) *
Хреновастый инструмент получается, ущербный
модель - не курсор, свою задачу она выполняет на 5.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 22.5.2010, 5:19
Сообщение #13


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 22.5.2010, 11:05) *
Цитата(maint @ 22.5.2010, 7:49) *
Хреновастый инструмент получается, ущербный
модель - не курсор, свою задачу она выполняет на 5.

курсор, как таковой изжит, в QT4 в пользу моделей, которые не могут осуществлять его функции. Так что, не вижу хорошего метода создания интерактивного поиска. Невозможность сделать то, что делают давно и многие ;). Шаг назад, однако
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.5.2010, 8:33
Сообщение #14


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


по идее модели для SQL поддерживают операцию fetch, т.е. если перемешаться по модели в стиле представления (надо посмотреть как оно это делает), то модель будет читать данные, которые ещё не читала.

А вообще для работы в стиле курсора есть класс QSqlQuery
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 22.5.2010, 9:00
Сообщение #15


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 22.5.2010, 14:33) *
по идее модели для SQL поддерживают операцию fetch, т.е. если перемешаться по модели в стиле представления (надо посмотреть как оно это делает), то модель будет читать данные, которые ещё не читала.

А вообще для работы в стиле курсора есть класс QSqlQuery

про query - все понятно. Но с начала темы идет задача поиска. Есть допустим отображение некого справочника (QTableView + QSqlTableModel) имеющего поле "имя", в котором надо искать вхождение заданной строки.

Допустим, мы сделали запрос и нашли запись с ключем, удовлетворяющим условие. Теперь неплохо было бы в отображаемой модели встать на эту запись по ключу. Не вижу способов реализации. Только перебор по списку. А это грустно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.5.2010, 11:56
Сообщение #16


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(maint @ 22.5.2010, 13:00) *
сделали запрос и нашли запись с ключем, удовлетворяющим условие.
запрос делали в БД и получили первичный ключ и по первичному ключу нужно сделать текущей строку в представлении?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 22.5.2010, 12:07
Сообщение #17


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 22.5.2010, 17:56) *
Цитата(maint @ 22.5.2010, 13:00) *
сделали запрос и нашли запись с ключем, удовлетворяющим условие.
запрос делали в БД и получили первичный ключ и по первичному ключу нужно сделать текущей строку в представлении?

совершенно верно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.5.2010, 13:12
Сообщение #18


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


maint, Ну это довольно просто, нужно воспользоваться моделью выделения (QItemSelectionModel).
Получаешь её у представления (table->selectionModel()).
Затем у модели данных просишь найти в заданной колонке нужное значение (QAbstractItemModel::match)
В качестве начального индекса передаёшь: QModelIndex(0, столбец_с_ПК, QModelIndex)
Т.к. этот столбец - первичный ключ, то значения в нём уникальны, следовательно первый же результат и будет индекс соответствующий строке с данным ПК, его передаёшь в модель выделения.

П.С. метод QAbstractItemModel::match можно использовать и для поиска по модели, не забираясь в БД

П.П.С. MoPDoBoPoT уже упоминал насчёт fetch, если рельтат поиска пустой, то нужно пользоваться методом fetch
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 22.5.2010, 14:58
Сообщение #19


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 22.5.2010, 19:12) *
maint, Ну это довольно просто, нужно воспользоваться моделью выделения (QItemSelectionModel).
Получаешь её у представления (table->selectionModel()).
Затем у модели данных просишь найти в заданной колонке нужное значение (QAbstractItemModel::match)
В качестве начального индекса передаёшь: QModelIndex(0, столбец_с_ПК, QModelIndex)
Т.к. этот столбец - первичный ключ, то значения в нём уникальны, следовательно первый же результат и будет индекс соответствующий строке с данным ПК, его передаёшь в модель выделения.

П.С. метод QAbstractItemModel::match можно использовать и для поиска по модели, не забираясь в БД

П.П.С. MoPDoBoPoT уже упоминал насчёт fetch, если рельтат поиска пустой, то нужно пользоваться методом fetch

спасибо, буду пробовать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 1.6.2025, 14:35