С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: FireMonkey
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/117: Рейтинг темы: голосов - 117, средняя оценка - 4.61
2 / 2 / 0
Регистрация: 01.08.2014
Сообщений: 14

FireDAC и иже с ним. Работа с SQLite

03.11.2014, 01:14. Показов 24069. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

История конечно печальна) Установил XE6 из за любопытства да и из за кроссплатформенности под ведро! ставился долго... иде хорошая лазе конечно далеко)... чуть посмотрев на возможности макаки столкнулся с проблемой когда захотелось поработать с бд... dbexpress в первые же минуты приказал долго жить) может проблема в сборке которая у меня стоит, но это отдельный вопрос... макДак работает но с ошибками которые наверное зависят напрямую от рук пишущего приходится таблички для бд ручками писать либо как вариант качать сторонний менеджер... но это не проблема как таковая! ГЛАВНАЯ проблема состоит в том что ума особо не могу дать на данный момент в реализации простой задачи с помощью fireDac который хоть как то, да работает!

Задача тривиальна! Как реализовать простое взаимодействие с бд! т.е:

делаем запрос sqlquery на получение данный и с занесением их в переменную и обратно! без помощи визуальных лайвбинов итд итп .... или же сними если не обойтись....

сегодня нашел статью http://docwiki.embarcadero.com... nd_Android)
хорошая но много там упущено для понимания макДАКА

Объясните пожалуйста механизм его работы!
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.11.2014, 01:14
Ответы с готовыми решениями:

AJAX и иже с ним
Доброго времени суток, господа программисты. У меня следующая проблема: есть игра (в рамках проектной работы по одной дисциплине),...

Sfinae и иже с ним
здравствуйте, дабы лучше разобраться с шаблонами решил сделать функцию, печатающую все элементы либо контейнера, либо массива. чтобы...

Combobox и иже с ним
Здравствуйте, уважаемые. Необходима помощь и разъяснения начинающему...в приложенном файле не могу записать 2 раза подряд информацию из...

15
2 / 2 / 0
Регистрация: 01.08.2014
Сообщений: 14
03.11.2014, 02:39  [ТС]
Вот пробуем добавить запись в бд.таблицу

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
begin
fdconnection1.Connected:=true;
 
fdquery1.SQL.Clear;
fdquery1.SQL.Add('insert into ttt(id,n) values (2,"dddd")');// если select * from ttt - то никаких ошибок нет! все работает
 
 
fdquery1.OpenOrExecute;
fdquery1.Close;
fdconnection1.Connected:=false;
end;
И видим такую картину
Миниатюры
FireDAC и иже с ним. Работа с SQLite   FireDAC и иже с ним. Работа с SQLite  
0
2 / 2 / 0
Регистрация: 01.08.2014
Сообщений: 14
03.11.2014, 11:48  [ТС]
Как говорится утро ночи мудренее! Проблема данной ошибки состояла в том что соединение dataExplorer в Delphi с БД было установлено и соответственно кто первый пришел тот и у руля! поэтому нельзя было обратиться к БД из программы!
Изображения
 
0
2 / 2 / 0
Регистрация: 01.08.2014
Сообщений: 14
03.11.2014, 12:13  [ТС]
Вот пример кода простой работы с SQLite db с помощью fireDAC!

Delphi XE6

1. В DataExplorer - fireDAC - SQLite db - Add New Connection
первая часть этой инструкции: http://docwiki.embarcadero.com... d_Android)

2. После создания БД или подключения своей кидаем на форму компоненты:

FDConnection1 - в свойстве ConnectionDefName выбираем свою базу

FDQuery1

FDGUIxWaitCursor1

FDPhysSQLiteDriverLink1

3. Для примитивного вывода значений Memo1 и три Button'a

4. Описываем процедуры для батонов

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Вывод значения записи по условию
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
fdconnection1.Connected:=true;
fdquery1.Close;
fdquery1.SQL.Clear;
fdquery1.SQL.Add('select * from ttt where id=1 ');
fdquery1.OpenOrExecute;
 
s:= fdquery1.FieldByName('n').AsString;
 memo1.Lines.Add(s);
 
fdquery1.Close;
fdconnection1.Connected:=false;
 
end;
 
// Обновление записи
procedure TForm1.Button2Click(Sender: TObject);
begin
 fdconnection1.Connected:=true;
fdquery1.Close;
fdquery1.SQL.Clear;
fdquery1.SQL.Add('update ttt set n="musya" where id=1');
fdquery1.ExecSQL;
 
 
 
fdquery1.Close;
fdconnection1.Connected:=false;
end;
 
// Создание записи в БД
procedure TForm1.Button3Click(Sender: TObject);
begin
  fdconnection1.Connected:=true;
fdquery1.Close;
fdquery1.SQL.Clear;
fdquery1.SQL.Add('insert into ttt (id,n) values (1,"xrusha")');
fdquery1.ExecSQL;
fdquery1.Close;
fdconnection1.Connected:=false;
end;
5. Проверяем отсутствие соединения DataExplorera с БД

И радуемся!

По счет интеграции БД с APK в Ведро! описывается в конце статья в пункте 1
1
2 / 2 / 0
Регистрация: 01.08.2014
Сообщений: 14
06.11.2014, 15:36  [ТС]
Хотя не все так хорошо как хотелось бы! Есть проблема! после того как загружаешь и устанавливаешь apk на телефон ОН НЕ ВИДИТ БАЗУ ... потому как параметр fdConnection1.ConnectionDefName на телефоне как бы отсутствует! и без него не как?! получается мала того что мы указываем путь БД в событии beforeCon... нужно как то задать свойство defName... как мне кажется оно в основном работает с ide а не с телефоном! Как решить эту ситуацию?
0
2 / 2 / 2
Регистрация: 04.11.2014
Сообщений: 33
17.12.2014, 07:25
Там в другом примере в соседней статье было:
1) на Beforeconnection необходимо кинуть:
Delphi
1
2
3
{$IF DEFINED(iOS) or DEFINED(ANDROID)}
form1.FDConnection1.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'Имябазы.sqlite3');
{$ENDIF}
2)в Deployment manager добавить базу в assets\internal\
3)в uses добавить System.IOUtils
4)обязательно для перезаписи базы необходимо в начале на устройстве приложение выгрузить из памяти
5)можно её прописать для тестов вручную: android/embacadero/project1/assets/internal
6)есть вариант на sd карту, но там много нюансов.
0
0 / 0 / 0
Регистрация: 16.08.2015
Сообщений: 23
10.01.2019, 22:25
Доброй ночи.
Помогите советом.
Есть иерархическая структура (дерево VirtualTreeView) для вывода информации + база данных SQLlite( компактная встраиваемая)
Есть рут :
MySQL
1
 select * from table1
Есть ноды-дети(например 2 уровня, в реальности уровней в будущем может быть и больше 7):
MySQL
1
select * from table2 where table2 .id2 =:ID1
ID1 - первый столбик с table1.
Второй уровень:
MySQL
1
select * from table3 where table3 .table2_id2 =:ID2
В общем чтоб заполнить дерево я рекурсией, прохожусь по каждому ноду
заполняю параметры и вызываю
fdquery.open;
при наличие в руте 100 нодов, я 100 раз заполняю и потом для каждого нода-дитя так же...
Что в свою очередь очень сильно замедляет загрузку. При БД около 2 Мб количество вызовов fdquery.open уже больше 19 000, загрузка 54 секунды.
Как можно оптимизировать приложение? Ибо в будущем база разрастётся больше 10Мб и количество вырастет даже больше 200 000.


И ещё параметров может быть не 1, а 2 или 3.
В общем приведу кусочек с реального SQL запроса.

MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SELECT group_concat(temptable1.ID_MainTableNAME) AS ID_MainTableNAME,
       group_concat(temptable1.STRVALUE_MainTableNAME, ' + ') AS STRVALUE_MainTableNAME,
       sum(temptable1.HINT_MainTableNAME) AS HINT_MainTableNAME,
       group_concat(temptable1.ID_MainTableClass) AS ID_MainTableClass,
       group_concat(temptable1.STRVALUE_MainTableClass, ' + ') AS STRVALUE_MainTableClass
  FROM (
           SELECT MainTable.ID AS ID_MainTableNAME,
                  MainTable.Name AS STRVALUE_MainTableNAME,
                  (CASE WHEN MainTable.Description ISNULL THEN 0 ELSE 1 END) AS HINT_MainTableNAME,
                  group_concat(MainTable_Classes.Class) AS ID_MainTableClass,
                  group_concat(Catalog_Classes.Name, ', ') AS STRVALUE_MainTableClass
             FROM MainTable
                  LEFT JOIN
                  MainTable_Classes ON MainTable.ID = MainTable_Classes.ID_Main
                  LEFT JOIN
                  Catalog_Classes ON MainTable_Classes.Class = Catalog_Classes.ID
            GROUP BY ID_MainTableNAME
       )
       AS temptable1
       INNER JOIN
       (
           SELECT ResearchTableAnchorMainTable.ID_MainTable AS ID_MainTableNAME,
                  ResearchTableAnchorMainTable.ID_RTAdapter AS ID_ResearchTableAdapterNAME,
                  ResearchTableAdapter.ID_ResearchTable AS ID_LOCK_ResearchName,
                  (CASE WHEN ResearchTableAdapter.Link ISNULL THEN 0 ELSE 1 END) AS STRVALUE_ResearchTableAdapterLink
             FROM ResearchTableAnchorMainTable
                  INNER JOIN
                  ResearchTableAdapter ON ResearchTableAdapter.ID = ResearchTableAnchorMainTable.ID_RTAdapter
       )
       AS temptable2 ON temptable2.ID_MainTableNAME = temptable1.ID_MainTableNAME and ID_ResearchTableAdapterNAME = :ResearchTableAdapterNAME
 GROUP BY temptable2.ID_ResearchTableAdapterNAME;



И так далее.

Как это всё оптимизировать? Проект бесплатный пишу для себя. База с элементами статистики.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
10.01.2019, 23:20
1. SQLite наверное ведь не зря Lite, правда?
в некоторых серверах работа с рекурсией предусмотрена
тут ничего такого нет
2. обычно структура размещается в одной таблице,
3. а зачем вам заполнять все дерево разом??
открываете узел - делаете запрос
0
0 / 0 / 0
Регистрация: 16.08.2015
Сообщений: 23
11.01.2019, 13:24
Цитата Сообщение от krapotkin Посмотреть сообщение
3. а зачем вам заполнять все дерево разом??
открываете узел - делаете запрос
Верхние ноды имеют ячийки данные в которых динамически обновляются в зависимости от нодов-детей. И ещё плюс к тому работает "фильтр" на ячейки. То есть ячейка может стать "не брать в расчёт" в зависимости от этого данные в родителе обновляются.
В общем программа портативный справочник, в котором можно быстро найти нужную информацию с применением фильтров. А это я могу осуществить только если все ноды инициализированы и все данные загружены в дерево.
Для большинства это программка бесполезна, а может и для всех. Но меня выручает. Уже с пол года не могу решить проблему "скорости". И проект стоит.
Краткое видео
p.s. Я самоучка с 2015 начал Delphi изучать. До этого только 1 курс ВУЗа.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
11.01.2019, 14:03
тогда берем все записи нижние, к ним джойним средние и верхние
точнее сказать не зная конкретики невозможно
в условии выборки задаем и фильтры
получаем все ноды одним запросом
далее бежим по полученному датасету и создаем все что нужно
лучше всего конечно если используется Virtual Tree View а не стандартное windows treeView
0
0 / 0 / 0
Регистрация: 12.12.2018
Сообщений: 24
20.04.2019, 14:55
Спасибо, давно мучал этот вопрос, помогло ;-)
+5 в тывку
0
3 / 3 / 0
Регистрация: 16.05.2019
Сообщений: 145
13.03.2021, 12:20
Цитата Сообщение от ToT888 Посмотреть сообщение
Там в другом примере в соседней статье было:
1) на Beforeconnection необходимо кинуть:
...
{$IF DEFINED(iOS) or DEFINED(ANDROID)}
form1.FDConnection1.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'Имябазы.sqlite3');
{$ENDIF}

2)в Deployment manager добавить базу в assets\internal\
3)в uses добавить System.IOUtils
4)обязательно для перезаписи базы необходимо в начале на устройстве приложение выгрузить из памяти
Всё сделано, как в примерах. Но на телефоне упрямо пишет "unable to open database file"
0
3 / 3 / 0
Регистрация: 16.05.2019
Сообщений: 145
14.03.2021, 15:27
Цитата Сообщение от ToT888 Посмотреть сообщение
Delphi
1
2
3
{$IF DEFINED(iOS) or DEFINED(ANDROID)}
form1.FDConnection1.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'Имябазы.sqlite3');
{$ENDIF}
Интересная картина получается:
База задеплоена в программу и находится в ее структуре "assets\internal"
А TPath.Combine(TPath.GetDocumentsPath, 'Имябазы.sqlite3') = /storage/emulated/0/Documents/...
таким образом, с учётом того, что не существует такого каталога, соответственно и базы там нет.
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,358
Записей в блоге: 3
14.03.2021, 16:08
Цитата Сообщение от Hevard Посмотреть сообщение
А TPath.Combine(TPath.GetDocumentsPath, 'Имябазы.sqlite3') = /storage/emulated/0/Documents/...
А что Вы, собственно, хотели увидеть? Посмотрите справку:
Returns the path to the directory where user documents are stored...
В Винде Вам эта функция выдала бы путь к папке документов текущего пользователя ("Мои документы"), под андроидом - то, что Вы и получаете...
0
3 / 3 / 0
Регистрация: 16.05.2019
Сообщений: 145
15.03.2021, 00:14
Цитата Сообщение от D1973 Посмотреть сообщение
А что Вы, собственно, хотели увидеть? Посмотрите справку:
На счёт Винды вопросов нет. Вопрос именно по "пути" в Андроид.
Файл базы находится внутри приложения, в самом арк, а папки Documents - не существует. Ни в .../0, ни в .../SD.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
15.03.2021, 08:11
вы точно уверены? у вас есть root для просмотра всех папок?
у каждой программы есть песочница, куда другие программы попасть не могут совсем
вот на эту папку указывают HomePath и DocumentsPath
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.03.2021, 08:11
Помогаю со студенческими работами здесь

OrderBy() и иже с ним
есть такой код static List<string> strout = new List<string>(); StreamWriter writer = new StreamWriter(@"c:\bits.txt"); ... ...

Магнитная мешалка и иже с ним
Здравствуйте уважаемые форумчане! По рабочим нуждам необходимо собрать в лабораторию магнитную мешалку. Вопрос мой будет связан...

Pipe и все иже с ним
Доброго вчемени суток не так давно мной была создана тема касательно процессов ...

После установки сомнительной программы куча мусора в виде известного браузера и иже с ним
Открывает рекламу, меняет поисковые системы и прочие пакости! Помогите, пожалуйста! Встала вся работа :((

Работа с SQLite
Здравствуйте! Функция подключения к БД у меня выглядит следующим образом: static bool createConnection () { QSqlDatabase db =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru