При разработке приложений под Android с использованием Delphi и FireMonkey часто возникают проблемы, связанные с работой баз данных SQLite. Одной из таких проблем является ошибка, указывающая на отсутствие таблицы, которую пытается обработать приложение. В данной статье мы рассмотрим, как исправить эту ошибку, возникающую при попытке заполнения комбобокса данными из SQLite базы в приложении для Android.
Проблема
Разработчик столкнулся с проблемой, когда при попытке запуска приложения на эмуляторе Android возникала ошибка TDBXError с сообщением 'no such table: cars'. При этом на Win32 приложение работало корректно, и данные в комбобокс заполнялись без ошибок.
Контекст
Пример кода, предоставленный разработчиком, использует компоненты TSQLConnection и TSQLQuery для взаимодействия с базой данных SQLite. Код предназначен для заполнения комбобокса уникальными значениями из таблицы cars.
procedure TForm1.Button1Click(Sender: TObject);
begin
// Пополнение списка производителей
SQLConnection1.Connected := True;
SQLQuery1.SQL.Clear;
SQLQuery1.Close;
SQLQuery1.SQL.Add('SELECT DISTINCT manufacturer FROM cars');
try
SQLQuery1.Open;
cbManufac.Items.Clear;
while not SQLQuery1.Eof do
begin
cbManufac.Items.Add(SQLQuery1.Fields[0].AsString);
SQLQuery1.Next;
end;
finally
SQLQuery1.Close;
end;
end;
Подтвержденный ответ
Проблема заключалась в неправильной настройке пути к базе данных SQLite. Для корректной работы с базой данных на устройстве Android необходимо правильно указать путь в событии BeforeConnect компонента TSQLConnection.
Альтернативный ответ и исправление
Согласно альтернативному ответу, предложено изменить путь к базе данных и использовать директорию assets\external в менеджере развертывания. Также рекомендуется изменить код события BeforeConnect следующим образом:
procedure TForm1.SQLConnection1BeforeConnect(Sender: TObject);
begin
{$IF DEFINED(iOS) or DEFINED(ANDROID)}
SQLConnection1.Params.Values['ColumnMetadataSupported'] := 'False';
SQLConnection1.Params.Values['Database'] :=
TPath.Combine(TPath.GetSharedDocumentsPath, 'cars.sqlite');
{$ENDIF}
end;
Рекомендации
Убедитесь, что база данных SQLite добавлена в настройки развертывания проекта.
Проверьте, что модуль System.IOUtils добавлен в раздел uses вашего проекта.
Используйте TPath.GetSharedDocumentsPath для корректного доступа к общим документам устройства.
Ознакомьтесь с документацией по стандартным функциям RTL для работы с путями в различных целевых платформах.
Следуя этим рекомендациям, вы сможете избежать ошибки отсутствия таблицы и успешно заполнить комбобокс данными из SQLite базы в приложении для Android.
Проблема разработчика связана с некорректной работой приложения на Android, вызванной отсутствием таблицы в базе данных SQLite, которое используется для заполнения данных в компонент комбобокса, и это происходит только на Android, в то время как на Win32
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS