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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Естественный порядок сортировки (natural sort) в sqlite  (Прочитано 6234 раз)
mwChief
Гость
« : Июль 14, 2011, 18:32 »

Возникла необходимость реализовать естественную сортировку чтобы, например, из набора:
Код:
a1
a10
a2
a3
a20
получить:
Код:
a1
a2
a3
a10
a20

Начав искать наткнулся на sqlite3_create_collation, а также на то что с поставляемым вместе с Qt sqlite этой функцией воспользоваться не получится.
Здесь http://www.mimec.org/node/296 нашел возможное решение проблемы:
Цитировать
When writing a cross-platform program which does not rely on Qt being built in any particular configuration, our only solution is to handle the third, most generic case. Fortunately the authors of SQLite make it easy to integrate it with any application by publishing the source code "amalgamated" into one source file and one header and the only disadvantage of such solution is the large size of the SQLite code.

When we include our own copy of SQLite, the program will compile fine, but it still may crash when started. The reason is that the QSQLiteDriver, which is part of Qt, will use its own copy of SQLite and our program will refer to a different copy. Each copy will use a separate set of global variables which are needed for synchronization and our copy will try to access some uninitialized objects resulting in the runtime error.

Unfortunately to make this work we need to not only use our own copy of SQLite but also our own copy of the QSQLiteDriver. We should copy the files containing QSQLiteDriver (which can be found in src/sql/drivers/sqlite folder of Qt sources) and also the sources of the internal QSqlCachedResult class (from src/sql/kernel) which is its base class to our program and change the names of these classes by removing the 'Q' prefix to prevent potential conflicts.
Но не совсем понял как заставить это работать. Нужно будет править pro-файл и собирать свой QSQLiteDriver?

Может есть какие-то другие варианты решения проблемы?
Записан
JayFOX
Гость
« Ответ #1 : Июль 14, 2011, 19:06 »

Если структура поля будет такая же, то могу предложить вариант:
Код:
SELECT * FROM t
ORDER BY SUBSTR(f,1,1), CAST(SUBSTR(f,2) AS INTEGER)
t - таблица, f - поле.
Иначе разбивать поле регулярным выражением.
Записан
mwChief
Гость
« Ответ #2 : Июль 14, 2011, 21:47 »

Формат текстовые поля могут иметь произвольный, да и хотелось бы универсального решения, без необходимости проверки что за поле сортируется. По сути вопрос лишь в том как заставить Qt работать с внешней sqlite  и добраться до функции sqlite3_create_collation.

Поискал еще на форуме и нашел такой вариант http://www.prog.org.ru/index.php?topic=16418.msg109092#msg109092
Для моих целей должно подойти, но вообще правильно ли это лезть в исходники Qt?
« Последнее редактирование: Июль 15, 2011, 00:27 от mwChief » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Июль 15, 2011, 10:56 »

Я может чего не понял, но в чём сложность самому отсортировать вычитанный список?
Записан

Qt 5.11/4.8.7 (X11/Win)
mwChief
Гость
« Ответ #4 : Июль 15, 2011, 11:56 »

Мне таблицу нужно отсортировать в модели и отобразить в QtableView. Модель сортировать сама не умеет, а только делает новый запрос к таблице указывая нужный порядок сортировки.
« Последнее редактирование: Июль 15, 2011, 12:00 от mwChief » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Июль 15, 2011, 12:16 »

Мне таблицу нужно отсортировать в модели и отобразить в QtableView. Модель сортировать сама не умеет, а только делает новый запрос к таблице указывая нужный порядок сортировки.
Ну дык и задействуй QSortFilterProxyModel с перегруженным lessThan().
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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