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

Лидеры

Популярный контент

Показан контент с высокой репутацией 23.05.2020 во всех областях

  1. Как же я намучился с этим одно время, нигде не нашел решение. Поделюсь, раз уж наткнулся на этот вопрос. Первое правило использования сервисов в под android - никаких упоминаний FMX и всего что связано с графикой, пусть вы и не используете её. Например: если вы упомянули в сервисе, в разделе uses FMX.Types - ваш сервис будет падать с ошибкой Segment fault. Также, допустим у вас есть юнит uMyUnit, и в этом юните в разделе uses есть FMX.Types - тоже будет падать с ошибкой Segment fault. Повторюсь, сервис никаким образом не должен знать об FMX. Причина падения FireDAC это - Wait курсор. Решение 1: Если вы используете designTime компонент, добавьте рядом компонент FDGUIxWaitCursor настройте его так: Property: Provide, Value: Console Property: ScreenCursor, Value: gcrNone Решение 2: Если вы используете динамическое создание подключения: uses ..., FireDAC.ConsoleUI.Wait, ... var FDGUIxWaitCursor: TFDGUIxWaitCursor; begin FDGUIxWaitCursor := TFDGUIxWaitCursor.Create(nil); FDGUIxWaitCursor.Provider := 'Console'; FDGUIxWaitCursor.ScreenCursor := TFDGUIxScreenCursor.gcrNone; end;
    1 балл
  2. Я нашел решение, к сожалению, пока только для работы с UniDAC: Обновил UniDAC компоненты для Berlin до последней версии (6.3.12). Компоненты TUniConnection и TUniQuery отлично работают с SQLite в Android Service. FireDAC в Android Service пока запустить не удалось, но у меня такой задачи нет. В Deployment host приложения добавляю файл базы данных, Remote Path задаю ".\assets\internal\". И спокойно из сервиса получаю к нему доступ. Мой сервис локальный в одном потоке с приложением. Если делать Intent Service или Remote — наверное, придется помещать файл в другой, доступный каталог, или общаться через намерения (Intents). Надеюсь мой код будет полезен для вас. procedure TDM.conSQLiteBeforeConnect(Sender: TObject); begin {$IF DEFINED(iOS) or DEFINED(ANDROID)} conSQLite.Database := TPath.Combine(TPath.GetDocumentsPath, 'mybase.sqlite'); {$ENDIF} end; procedure TDM.conSQLiteError(Sender: TObject; E: EDAError; var Fail: Boolean); begin Log('--- DB error: %s:', [E.Message]); Fail := False; end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin Log('+ START with Intent: ' + JStringToString(Intent.getAction.toString), []); if Intent.getAction.equalsIgnoreCase(StringToJString('StopIntent')) then begin try conSQLite.Disconnect; Log('- DB disconnected', []); except on E: Exception do Log('- can not to disconnect DB', [E.Message]); end; Log('... service to be stoped', []); JavaService.stopSelf; Result := TJService.JavaClass.START_NOT_STICKY; // don't reload service end else begin Log('... service started', []); try conSQLite.Connect; Log('+ DB connected', []); UniQuery.SQL.Text := 'select count(*) as ALLREC from orders'; UniQuery.Open; if UniQuery.RecordCount > 0 then begin UniQuery.First; Log('... record count: %s', [UniQuery.FieldByName('ALLREC').AsString]); end; UniQuery.Close; except on E: Exception do Log('- can not to connect DB: %s', [E.Message]); end; Result := TJService.JavaClass.START_STICKY; // rerun service if it stops end; end;
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...