crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
kibsoft
  опции профиля:
сообщение 11.2.2010, 22:08
Сообщение #1


Участник
**

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

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




Репутация:   2  


Как искать например строку в модели? Перебирать строки? setFilter()?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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
а её может и не быть в модели в данный момент
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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