Перейти к содержанию
Fire Monkey от А до Я
  • 0

Доступ к БД из сервиса


Adm123

Вопрос

Собственно, сабж в заголовке. Как? 

Пытаюсь использовать SQLite + FDConnection. 

  FDConnection.Params.Database:= TPath.Combine(System.IOUtils.TPath.GetDocumentsPath, 'basename.db');

работает в основной форме, но вешает сервис...

Изменено пользователем Adm123
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

если не секрет что можно делать в оффлайн базе ? сервисом ? 

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

TNotificationCenter

Изменено пользователем master webs
Ссылка на комментарий
  • 0

Возможно проблема в System.IOUtils.TPath.GetDocumentsPath

Попробуйте прописать путь к базе константой. System.IOUtils.TPath.GetDocumentsPath - возвращает путь к папке "Мои документы" пользователя, а сервисы запускаются от своего пользователя.

Ссылка на комментарий
  • 0
18 минуту назад, master webs сказал:

если не секрет что можно делать в оффлайн базе ? сервисом ? 

Не секрет. Из нее можно брать условия для парсинга и складывать в нее результаты.

 

9 минут назад, dnekrasov сказал:

Возможно проблема в System.IOUtils.TPath.GetDocumentsPath

Спасибо, попробую

Ссылка на комментарий
  • 0

setings.LoadFromFile(TPath.GetDocumentsPath + TPath.DirectorySeparatorChar +'seting.json');

я так подгружаю

сделайте проверку файла есть ли он там 

if FileExists(TPath.GetDocumentsPath + TPath.DirectorySeparatorChar +'seting.json') then

Изменено пользователем master webs
Ссылка на комментарий
  • 0
20 минуты назад, master webs сказал:

сделайте проверку файла есть ли он там 

if FileExists(TPath.GetDocumentsPath + TPath.DirectorySeparatorChar +'seting.json') then

База по выбранному пути есть и из юнита основной программы нормально цепляется

Ссылка на комментарий
  • 0
43 минуты назад, Adm123 сказал:
1 час назад, dnekrasov сказал:

Возможно проблема в System.IOUtils.TPath.GetDocumentsPath

Попробуйте прописать путь к базе константой.

Увы, не помогло...

Если файл базы лежит в документах пользователя - то сервис, возможно, просто не имеет прав доступа в эту папку. Попробуйте его переместить в папку общие документы (тогда можно будет использовать System.IOUtils.TPath.GetSharedDocumentsPath) или в какую-нибудь другую публичную папку.

 

20 минуты назад, master webs сказал:
1 час назад, dnekrasov сказал:

Возможно проблема в System.IOUtils.TPath.GetDocumentsPath

Попробуйте прописать путь к базе константой.

Увы, не помогло...

Полностью согласен, только одно маленькое дополнение - вместо TPath.GetDocumentsPath + TPath.DirectorySeparatorChar лучше использовать IncludeTrailingPathDelimiter(TPath.GetDocumentsPath)

Ссылка на комментарий
  • 1

Да не в путях тут дело. Чтобы завис нормальный рабочий сервис достаточно просто кинуть ему на форму FDConnection. И ничего никуда не подключать, никак этот FDConnection не использовать...

Так что дело тут в использовании компонента. И вопрос остается открытым - как общаться с БД в сервисе?

Ссылка на комментарий
  • 0

ищите другой вариант реализации например список задач выгружайте в json  в сервисе обрабатывайте  по завершению отправляйте уведомление что все сделано  и заносите изменения в базу уже в запущенном состояние потом опять также  создавайте список новых задач или одни и тек же крутите постоянно до определенного условия  бесконечны циклы вроде можно запустить и выйти с него так же можно

обрабатывать базу данных в сервисе большего извращения нет  так как размер может быть непредсказуем и вы просто сожрете все ресурсы на телефоне 

Изменено пользователем master webs
Ссылка на комментарий
  • 0

Товарищи, вот у меня такой же вопрос, как в сабже.

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

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

P.S.: Приложение работает с базой SQLite, но на устройстве базу найти не могу, ни в каталоге приложения, ни поиском по всему устройству. В чем фокус, может кто знает?

procedure TDM.conSQLiteBeforeConnect(Sender: TObject);
var
  dbPath: string;
begin
{$IF DEFINED(iOS) or DEFINED(ANDROID)}
  dbPath := TPath.Combine(TPath.GetDocumentsPath, 'mybase.sdb');
{$ENDIF}
{$IF DEFINED(MSWINDOWS)}
  dbPath := TPath.GetFullPath(TPath.Combine(TPath.GetLibraryPath, '..\..\..\DataBase\mybase.sdb'));
  if not FileExists(dbPath) then
    dbPath := TPath.GetFullPath(TPath.Combine(TPath.GetLibraryPath, 'mybase.sdb'));
{$ENDIF}
  conSQLite.Database := dbPath;
end;

 

Ссылка на комментарий
  • 0

Товарищи, вот у меня такой же вопрос, как в сабже.

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

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

P.S.: Приложение работает с базой SQLite, но на устройстве базу найти не могу, ни в каталоге приложения, ни поиском по всему устройству. В чем фокус, может кто знает?

 

UPDATE:

Я нашел решение, отписался в этой ветке.

procedure TDM.conSQLiteBeforeConnect(Sender: TObject);
var
  dbPath: string;
begin
{$IF DEFINED(iOS) or DEFINED(ANDROID)}
  dbPath := TPath.Combine(TPath.GetDocumentsPath, 'mybase.sdb');
{$ENDIF}
{$IF DEFINED(MSWINDOWS)}
  dbPath := TPath.GetFullPath(TPath.Combine(TPath.GetLibraryPath, '..\..\..\DataBase\mybase.sdb'));
  if not FileExists(dbPath) then
    dbPath := TPath.GetFullPath(TPath.Combine(TPath.GetLibraryPath, 'mybase.sdb'));
{$ENDIF}
  conSQLite.Database := dbPath;
end;

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...