![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
kibsoft |
![]()
Сообщение
#1
|
Участник ![]() ![]() Группа: Участник Сообщений: 180 Регистрация: 21.7.2009 Из: Самара Пользователь №: 928 Спасибо сказали: 14 раз(а) Репутация: ![]() ![]() ![]() |
Как искать например строку в модели? Перебирать строки? setFilter()?
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
а каковы условия поиска? Может выгоднее озадачить этим СУБД?
|
|
|
MoPDoBoPoT |
![]()
Сообщение
#3
|
Участник ![]() ![]() Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: ![]() ![]() ![]() |
Именно в 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 |
![]()
Сообщение
#4
|
Участник ![]() ![]() Группа: Участник Сообщений: 180 Регистрация: 21.7.2009 Из: Самара Пользователь №: 928 Спасибо сказали: 14 раз(а) Репутация: ![]() ![]() ![]() |
Ну если я например уже заполнил модель всей таблицей, зачем мне делать поиск средствами СУБД(работать дольше будет), если все это есть в оперативке? Или я что-то не так понимаю?
|
|
|
MoPDoBoPoT |
![]()
Сообщение
#5
|
Участник ![]() ![]() Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: ![]() ![]() ![]() |
ХЗ в общем, надо от гуру услышать ответ (:
Насчет работы QAbstractItemModel::match() для SQL-моделей(QSqlQueryModel, QSqlTableModel...). Могут быть такие грабли: для некоторых БД тянутся не все данные, а только первые 255 записей, остальное загружается по мере надобности (так называемое ленивое заполнение). Так из-за этого при работе с match() можно получить не то, что ожидалось (не полный объем). Для закачки всех данных используют:
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Ну если я например уже заполнил модель всей таблицей, зачем мне делать поиск средствами СУБД из соображений быстроты, дело в том, что в СУБД, если БД спроектирована корректно, уже построены индексы. А в программе нет. Я пробовал делать вообще простую вещь, разрешать сортировку по столбцам в представлении. А таблица в БД содержала несколько сот тысяч записей. И при первом показе таблица программа задумывалась почти на минуту.Так из-за этого при работе с match() можно получить не то, что ожидалось (не полный объем). хорошее замечание.Для закачки всех данных используют: если их много то ПО сожрёт кучу памяти.
|
|
|
maint |
![]()
Сообщение
#7
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 235 Регистрация: 3.8.2009 Из: Иркутск Пользователь №: 982 Спасибо сказали: 28 раз(а) Репутация: ![]() ![]() ![]() |
кстати вопрос довольно интересный. Если нужно последовательно искать вхождения в каком то поле таблицы, чего предпринять ? В любом тексте электоронного документа мы шаримся по мере нахождения нужного вхождения. Как это сделать в базе, ума не приложу. В почти покойных dbf сначала первое вхождение искали по seek, потом как кому фантазия подскажет, но все равно перебором. Я решения нормального не знаю.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
maint, нормальное решение заключается в том, чтобы каждый инструмент делал только ему предназначенную работу. Поиск должна выполнять СУБД.
У многих СУБД найдутся способы поиска подстроки, например:
|
|
|
maint |
![]()
Сообщение
#9
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 235 Регистрация: 3.8.2009 Из: Иркутск Пользователь №: 982 Спасибо сказали: 28 раз(а) Репутация: ![]() ![]() ![]() |
maint, нормальное решение заключается в том, чтобы каждый инструмент делал только ему предназначенную работу. Поиск должна выполнять СУБД. У многих СУБД найдутся способы поиска подстроки, например:
кстати, не могу сообразить или плохо искал. Как встать в модели на запись с ключом, ну скажем 30. Именно ключ, а не номер по порядку. like хорош очень. Но не всегда хорошо с кириллицей. В sqlite3 точно фигня. У меня ощущение, что upper и lower - просто в качестве заглушки стоят ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 2.5.2025, 20:31 |