Russian Qt Forum

Qt => Базы данных => Тема начата: mwChief от Июль 14, 2011, 18:32



Название: Естественный порядок сортировки (natural sort) в sqlite
Отправлено: 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 (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?

Может есть какие-то другие варианты решения проблемы?


Название: Re: Естественный порядок сортировки (natural sort) в sqlite
Отправлено: JayFOX от Июль 14, 2011, 19:06
Если структура поля будет такая же, то могу предложить вариант:
Код:
SELECT * FROM t
ORDER BY SUBSTR(f,1,1), CAST(SUBSTR(f,2) AS INTEGER)
t - таблица, f - поле.
Иначе разбивать поле регулярным выражением.


Название: Re: Естественный порядок сортировки (natural sort) в sqlite
Отправлено: mwChief от Июль 14, 2011, 21:47
Формат текстовые поля могут иметь произвольный, да и хотелось бы универсального решения, без необходимости проверки что за поле сортируется. По сути вопрос лишь в том как заставить Qt работать с внешней sqlite  и добраться до функции sqlite3_create_collation.

Поискал еще на форуме и нашел такой вариант http://www.prog.org.ru/index.php?topic=16418.msg109092#msg109092
Для моих целей должно подойти, но вообще правильно ли это лезть в исходники Qt?


Название: Re: Естественный порядок сортировки (natural sort) в sqlite
Отправлено: GreatSnake от Июль 15, 2011, 10:56
Я может чего не понял, но в чём сложность самому отсортировать вычитанный список?


Название: Re: Естественный порядок сортировки (natural sort) в sqlite
Отправлено: mwChief от Июль 15, 2011, 11:56
Мне таблицу нужно отсортировать в модели и отобразить в QtableView. Модель сортировать сама не умеет, а только делает новый запрос к таблице указывая нужный порядок сортировки.


Название: Re: Естественный порядок сортировки (natural sort) в sqlite
Отправлено: GreatSnake от Июль 15, 2011, 12:16
Мне таблицу нужно отсортировать в модели и отобразить в QtableView. Модель сортировать сама не умеет, а только делает новый запрос к таблице указывая нужный порядок сортировки.
Ну дык и задействуй QSortFilterProxyModel с перегруженным lessThan().