• 0
flexit

XE8, не могу установить соединение с базой Sqlite на устройстве под Android

Вопросы

Здравствуйте!

 

Для создания соединения использую TFDConnection.

Под Windows проблем нет, на планшете под Андроидом возникает ошибка:

[FireDAC][stan][Def]-254. Definition [lbase] is not found in [].

Физически база на устройстве присутствует, вижу ее в файловом менеджере и в коде проверяю наличие файла с помощью TFile.Exists.

 

Код:

 

procedure TForm5.FDConnection1BeforeConnect(Sender: TObject);
var DBPath: string;
begin
  {$IFDEF ANDROID}
     DBPath:=TPath.GetSharedDocumentsPath + PathDelim + 'lbase.db';
  {$ELSE}
     DBPath:='d:\test\lbase.db';
  {$ENDIF}
  if TFile.Exists(DBPath) then
    ShowMessage('File exist') else
    ShowMessage('File not exist');
  FDConnection1.Params.Values['Database']:= DBPath;
end;
 
procedure TForm5.Button1Click(Sender: TObject);
begin
  FDConnection1.Connected:=true;
end;

TestConnect.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 ответов на этот вопрос

  • 0

Я делал так,

FDMainConnection.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'DB.s3db');

Создает в моих документах на винде, и где-то не знаю где на андроидах)

Так же мб понадобится

FDMainConnectionAfterConnect(Sender: TObject);
begin
  FDMainConnection.ExecSQL('CREATE TABLE If Not Exists [TableName] (' + #13#10 +
                           '[IdObject] INTEGER  PRIMARY KEY NOT NULL,' + #13#10 +
                           '[SomeField] INTEGER  NULL' + #13#10 +
                           ')');
end { FDMainConnectionAfterConnect };

и т.д.

Изменено пользователем umkes

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

может, дело в GetSharedDocumentsPath ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

GetSharedDocumentsPath не работает

GetDocumentsPath работает 

 FDConnection1.Params.Values['Database']  := TPath.Combine(TPath.GetDocumentsPath, 'lbase.db');

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

GetSharedDocumentsPath не работает

GetDocumentsPath работает 

 FDConnection1.Params.Values['Database']  := TPath.Combine(TPath.GetDocumentsPath, 'lbase.db');

Так я тоже пробовал и с тем же результатом. Изначально в Deloyment указывал .\assets\internal и использовал функцию GetDocumentsPath.

Потом попробовал указывать в Deloyment .\assets в качестве RemotePath и использовать функцию GetSharedDocumentsPath. В результате  TFile.Exists показывает в обоих случаях, что файл базы присутствует, но ошибка все равно возникает.

TPath.Combine я тоже использовал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Попробовал использовать компонент TSqlConnection вместо TFDConnection c тем же самым кодом - ошибки при соединении не происходит. Придется использовать dbExpess вместо FireDAC.

И все же интересно, в чем же может быть проблема при работе с компонентом TFDConnection. Есть какие-нибудь идеи?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

я еще хочу добавить что ничего в Deloyment  не трогал, там какие-то нюансы есть. Просто создавал БД если ее нету и юзал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Все же я вернулся к TFDConnection и выяснил следующее.

 

Перед установкой соединения при компиляции под Windows можно написать:

  FDConnection1.Params.Values['DriverID']:='SQLite';

  FDConnection1.Params.Values['Database']:= DBPath;   
или 
  FDConnection1.ConnectionString:='DriverID=SQLite;Database='+DBPath;
Проблем не будет в обоих случаях.
 
А вот под Андроид первый вариант выдает ошибку [FireDAC][stan][Def]-254. Definition [baseName] is not found in [],
а второй - успешно работает.
 
P.S. Только начал изучать разработку мобильных приложений в Delphi, но подобные 'милые особенности' на каждом шагу уже успели изрядно утомить. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
а зачем каждый раз указывать драйвер? один раз задал и все на форме. 
 
у меня так все работает. и этот пример брал из примеров. 
 
  {$IF DEFINED(IOS) or DEFINED(ANDROID)}
    DBCon.Params.Values['Database'] :=
        TPath.Combine(TPath.GetDocumentsPath, 'database.db3');
  {$ELSE}
    DBCon.Params.Values['Database'] :=
       ExtractFilePath(ParamStr(0)) +  'database.db3';
  {$ENDIF}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Я тоже начинал с таких примеров и понимаю, что это штатный вариант.

Но у меня он не проходит, и думаю, что кривизна рук тут не при чем.

 

На форме у TFDConnection драйвер у меня тоже указан.

Но если я напишу в  ConnectionString='Database='+DBPath, то TFDConnection не понимает, какой драйвер нужно использовать.

Ну а Params.Values['DriverID']:='SQLite' можно писать, или не писать - все равно в этом варианте при компиляции под Андроид  возникает ошибка при попытке коннекта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу