私は解決策を見つけた:
私は、最新バージョン(6.3.12)にベルリンUniDACコンポーネントを更新しました。
TUniConnectionとTUniQueryは、AndroidサービスのSQLiteでうまく動作します。
Add to Project->ホストアプリケーションの展開私のSQLite DB-ファイル、リモートパスは "。\ assets \ internal \"に設定されています。
このコードが役に立ちますようお願いいたします。
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;
AndroidデバイスにSqliteを追加したい場合は、Android上で動作するSqliteのエディションが必要です(存在する場合)。 ADOはWindowsのみafaik、btwです。もう1つの方法は、WindowsホストのRESTサーバーを作成し、それにAndroidアプリに書き込むことです。 – MartynA
メインアプリケーションが終了してもサービスは実行されている場合はどうすればよいですか?サービスからアプリケーション(インテントや他の誰かのような)にメッセージを送信すると、アプリケーションが実行され、私はそれを望んでいません。 –