Pull to refresh

Comments 57

А полнотекстовый поиск они встроили или до сих пор отключают?
UFO just landed and posted this here
Не нужен, потому что плох, или потому что ему там не место?
UFO just landed and posted this here
Реальный пример:

База > 40 000 записей.
Средний объем записи — 2-3 Кб plain text.

Поиск < 1c.
Файл БД на диске.

имхо, в Thunderbird «наведенные» проблемы от общей реализации.
UFO just landed and posted this here
FTS3 реально быстр. Он быстрее, чем аналогичные LIKE запросы (проверял лично).
Однако, это накладывает ограничения на структуру таблицы. Подробнее можно ознакомиться по линку выше. Вообще, говорят, что SQLite надо уметь готовить.
UFO just landed and posted this here
Использую FTS4. Он декларируется как еще более быстрый.
Может увеличить размер индекса на 1-2% (макс 10% если записи очень маленькие).
Плюс в нем появилась возможность полноценно считать релевантность, за счет доп. информации в индексе.
Но как только начал писать и читать одновременно, всё тут же стало очень грустно, база просто залочилась. А жаль.

Да, в плане многопользовательской(многопоточной) работы на запись sqlite не подходит. Но если надо один раз много записать, а потом быстро читать — вполне.

К слову, из бесплатных альтернатив встраиваемого fts-поиска знаю только Apache CLucene. Его кстати Qt использует в Assistant.
По умолчанию отключен. Как и раньше, надо пересобирать с парой дефайнов, чтобы включить.
Доступ к БД является синхронным по умолчанию, остается воспользоваться потоками, запихивая запросы в них.
Это печально… Может все-же есть нормальный неблокирующий путь с сигнлами-слотами?
По правде еще не пробовал такой сценарий, думаю хорошая «идея», начну прямо сейчас.
А вы не разбирались с возможностью скажем так «репликации» sqlite базы :memory: в файловый аналог? Есть такая фича или надо самому писать?
UFO just landed and posted this here
Думаю вы об этом:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "connection1");
db.setDatabaseName(":memory:");
if (!db.open()) {          
    return false;
}

UFO just landed and posted this here
Paging он сам делает внутри, на сколько я знаю.
Я не нашел такой возможности из коробки и посему писал сам.
Эта возможность реализуется через SQLite Online Backup API. Там и пример есть, как раз того, что Вам нужно.
Как параметру присвоить NULL-значение? (У меня на PyQt не получилось; так и не понял, почему)
Может QVariant() попробовать?
Какие люди падкие на халяву. Описали какие-то простейшие вещи которые есть в офф референсе, и сделали пару простейших примеров. Абсолютно не затронута работа в connections, транзакции, про использование varchar в sqlite это бред(вы даже не удосужились прочесть референс внимательно). И интересно что вас не срослось MySQL сервером? Если чесно вот такие профанские статьи очень удручают хабр стал совсем не торт…
Увидев посты, написанные вами, тут же осознал, что я написал «никчемный» пост, простите пожалуйста, больше не буду. А вы продолжайте писать ваши великолепные посты.
Достойный ответ. Уж извините, что мне испаганили карму(за комментарии с орфографическими и синтаксическими ошибками) настолько, что написать хоть что-то не представляется возможным. Не на этом ресурсе по крайней мере. По существу что-нибудь можете сказать? А именно, что в вашей статье такого что нельзя почерпнуть просто пробежавшись глазами по референсу? предисловие, в котором написано «Автор постарался как можно подробнее рассматривать программирование баз данных в Qt.»? Уберите это и не позорьтесь. За ссылки на вики тоже отдельное спасибо, очень позновательно… Честно, если нокия отдаст вам и вам подобным халявщикам n950 мне будет очень обидно… К слову чтобы дать понять, что я не просто так бодаюсь, я работаю на нокию(именно «на», а не «в»). Подключить только используемые классы, кстати, вы не пробовали кстати? По скольку ограничен в возможностях ответ товарищу на комментарий habrahabr.ru/blogs/qt_software/128836/#comment_4264513: Если поле поддерживает NULL в базе данных(при создании таблицы задается), то в C++ Qt при записи значения надо указать QVariant() — в референсе опятьже написано об этом. Референс Qt, если его прочитать, а не просто «потыкаться», вообще много о чем раскажет, и такие вот и подобные статьи не нужны будут.
1. Есть люди плохо знающие английский! Ваш английской референс им не так поможет.
2. Я и не обещал рассказать что-то новое.
3. Я рассказал то, что «узнал» во время опытов с моим приложением, а это достойно, как минимум, внимания.
4. Не думаю, что я позорюсь из-за поста, если вам не помог, может даже вызвал отвращение, другим может пригодится.
5. Мне пофигу высказывания вроде «тупой пост!!!», «а че книги не читаете!!!»(ведь там все написано), «ты знаком с технологией Х пару часов! хаа-хаа!». Не нравится — напиши лучше, больше, красивее — не в Хабре, так в другом месте — укажи линк, буду рад.
6. Получив линк от вас — не значит, что я был не прав, просто пункт 5-й дает вам шанс объяснится за ваши «никчемные» комментарии.
7. Мое любимое. Сейчас все кому не лень могут работать в/на Нокию, одному мне известны более 10-и «очень обычных, средних» программистов, которые недавно попали в фирму Нокиа. Может им уже «хана», может я ошибаюсь, но «Нокиа» — это вам не «Гугл»!
> Сейчас все кому не лень могут работать в/на Нокию, одному мне известны более 10-и «очень обычных, средних» программистов, которые недавно попали в фирму Нокиа.
Речь идет о людях, достаточно близко знакомых со мной.
Знаю, что у вас нет возможности быстро ответить из-за кармы, так что это не проблема, я ни куда не спешу. Это не сарказм, просто, чтоб другие не подумали, что вы «сдались», так, на всякий случай))
>Если чесно вот такие профанские статьи очень удручают хабр стал совсем не торт…

А всё почему? А потому что максимум, чем утруждают себя «не-профаны», так это комментами про то, что хабр не торт, а не написанием «правильных» статей.
я тоже считаю эту статью «слишком поверхностной», что ли, и опять же не узнал из нее ничего нового. и самому писать такие статьи не хочется, т.к. опять же мало кому они принесут пользу :)
сам я просто не знаю о чем писать, увы, мне кажется все в Qt очевидным уже, может подскажете какую-нибудь интересную для хабровчан тему по Qt? мог бы освятить
ну и очевидно, чтобы эта тема не вынуждала меня повторять то, что уже написано в официальной документации, ибо считаю это явной глупостью (:
Документация — она большая. Думаю, мало кто из тех, кто сейчас активно программирует на Qt, изучил её всю. А значит о некоторых вещах может попросту не подозревать, причём даже не знать о самом их существовании.
А зачем изучать ее всю? Она для того и написана чтобы ей пользоваться по необходимости. Для этого же создан assistant с отличной навигацией, индекстом и поиском. Надо понимать основы, когда что-то не знешь можно спросить, лучшее место для этого Qt Developer Network, не говорящие по-ангkийски смогут найти там русскоговорящую группу и задавать свои вопросы там, огромное количество профессионалов (в том числе сертифицированных специалистов и самих разработчиков Qt) достаточно быстро подскажут вам направление в котором стоит начинать исследования или читать документацию, и помогут решить проблему. Присоединяйтесь. (Нет я не работаю в/на нокию и это не пиар)
Понятно, что когда нужно что-то конкретное, то идёшь и смотришь по мере необходимости, но разработчик, повторяю, "… о некоторых вещах может попросту не подозревать, причём даже не знать о самом их существовании".
Да мало ли тем, которые не были затронуты: мета-объекты, особенности механизма слотов-сигналов в многопоточных программах, трюки с .pro-файлами (платформо-специфичные блоки, переменные окружения, и т.д.), канвас (который ныне QGraphicsView) и разного рода манипуляции с его объектами…

P.S.: и я вас умоляю: осветить (т.е. «пролить свет»)! Процесс «освящения» обычно включает в себя размахивание кадилом и брызги святой водой — я сомневаюсь, что вы собирались делать именно это %)
Встроенные средства в QT4 для работы с СУБД скорее демонстрация, а не решения которыми должен пользоваться разработчик. Обычно Model/View архитектура позволяет быстро и без особых затрат сделать все, что надо для интерфейса к СУБД если воспользоватся готовыми библиотеками на C/C++ из открытых источников.

Я работаю на PyQT4. В Python отлично сделана работа с различными СУБД, а SQLite вообще встроен.
Да очень многие «удобные классы» в Qt ( например QSql(Relational)TableModel ) пригодятся вам, лишь в отдельных случаях когда их реализация четко подходит под вашу текущую задачу. Но за что мне нравиться кьют, стоит посмотреть на уровень ниже (опустившись до абстрактных предков) и можно реализовать почти любую архитектуру приложения, написав подходящие вам аналоги «удобных классов».
Например реализовать работу одной модели с бд имеющей (1:M), (M-N) связи, стандартная QSql(Relational)TableModel такого к сожалениу не может.
И наконец, можно просто использовать подставляемые аргументы, которые предоставляет QString

Но лучше всё-таки использовать bindValue.
QString не знает о том, что иногда нужно экранировать параметры SQL запроса
SQLite конечно отличная штука, но вот использование регистронезависимого LIKE с UTFными строками требует страшных танцев с бубном и то не всегда приводит к требуемым результатам.
В догонку напишите пожалуйста актуальную инструкции по сборке драйвера SQLite с поддержкой ICU (aka регистронезависимого like/upper/lower) для windows и linux.
Хотел топиком, да кармы не хватило.

Сборка в Windows Qt-плагина sqlite с поддержкой регистронезависимого LIKE дле UTF8-символов не из ASCII-таблицы.

Скачиваем Qt 4.7.4.
Устанавливаем в C:\Qt\4.7.4.
Скачиваем исходники sqlite 3.7.8.
Распаковываем в C:\soft\sqlite-src.
Скачиваем бинарники icu 4.8.
Распаковываем в C:\soft\icu-bin.

Изменяем содержимое C:\Qt\4.7.4\src\3rdparty\sqlite.pri

CONFIG(release, debug|release):DEFINES *= NDEBUG
DEFINES += SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_COMPLETE SQLITE_ENABLE_ICU
INCLUDEPATH += $$PWD/sqlite \
$$SQLITE_DIR/src
win32 {
INCLUDEPATH += $$ICU_DIR/include
}
unix {
INCLUDEPATH += $$ICU_DIR/common
}
SOURCES += $$PWD/sqlite/sqlite3.c \
$$SQLITE_DIR/ext/icu/icu.c
LIBS += -L$$ICU_DIR/lib

win32 {
LIBS += -licuuc \
-licuin
}

unix {
LIBS += -lcudata \
-lcui18n \
-lcuuc
}

Открываем Qt 4.7.4 Command Prompt
C:\Qt\4.7.4>cd C:\Qt\4.7.4\src\plugins\sqldrivers\sqlite\
C:\Qt\4.7.4\src\plugins\sqldrivers\sqlite>qmake sqlite.pro ICU_DIR=«C:\soft\icu-bin» SQLITE_DIR=«C:/soft/sqlite-src»
C:\Qt\4.7.4\src\plugins\sqldrivers\sqlite>nmake all

… компиляция…

В подпапках debug и release получаем соответствующие бинарники.

Помимо qsqlite4.dll с приложением надо будет поставлять файлы:
icudt48.dll
icuin48.dll
icuuc48.dll
из каталога C:\soft\icu-bin\bin\
pastebin.com/raw.php?i=qtLTr7me
Если сейчас хватает, то просится топиком))
Не хватает :(.
Дополнил инструкцией для Linux. Пока в черновиках лежит.
К сожалению не собирается при помощи стандартного входящего в поставку Qt Creator MinGW/GCC.
Вываливает гору предпреждений и ошибок :(

Может всё же есть способ? (читай как: а-а-а-а помогите!!!)
Для MinGW как минимум другие бинарники icu нужны. На сайте готовых нет — значит надо собирать самому. Попробую.
В общем со сборкой библиотеки ICU под Windows с помощью MinGW есть проблемы.

Почему бы Вам не воспользоваться компилятором от Microsoft?
Можно поставить бесплатную Express-версию Visual Studio.
Хех. В экспресс версии нет возможности подключить Qt add-in.
Да и вообще, кошерно использовать то, что предоставляет Qt/Nokia и работает более-менее одинаково на всех платформах.
Вобщем так и останется SQLite в Qt только малоприменимой игрушкой :(
Хех. В экспресс версии нет возможности подключить Qt add-in.

И что? Вы же собирались роботать в QtCreator.
Ставите MSVS Express. Запускаете QtCreator, настраиваете его на компилятор от MSVS.

Да и вообще, кошерно использовать то, что предоставляет Qt/Nokia и
работает более-менее одинаково на всех платформах.

Nokia предоставляет библиотеку Qt. Это кроссплатформенный продукт. И работать с ним лучше теми средствами, которые наиболее естественны для конкретной платформы. В случае Windows это MSVS и ее компилятор.

Вобщем так и останется SQLite в Qt только малоприменимой игрушкой :(

Многие с Вами не согласятся.
> Проверить размер, вернее количество строк данных (результата) можно методом size(). Важно помнить, что первая запись находится в позиции 0, запрос должен быть в активном состоянии, а isSelect() возвращать true (это происходит, если последним запросом был SELECT)

Здесь написаны фантазии автора.

Метод size() не поддерживается в SQLite, и всегда возвращает -1.

query.size() is not supported with SQLite. But you can get the number of rows with a workaround. QSqlQuery::last () retrieves the last record in the result, if available, and positions the query on the retrieved record. After calling last() you can retrieve index of the last record and position the query before the first record using first() and previous()


Подробности тут: stackoverflow.com/questions/26495049/qsqlquery-size-always-returns-1
Sign up to leave a comment.

Articles