我找到了一個解決方案:
我更新UniDAC組件柏林最新版本(6.3.12)。
TUniConnection和TUniQuery可以很好的與Android Service中的SQLite結合使用。
添加到項目 - >部署主機應用程序我的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;
如果您希望您的Sqlite位於Android設備上,那麼您需要一個在Android上運行的Sqlite版本(如果存在)。 ADO是Windows-only afaik,順便說一句。另一種方式可能是編寫一個Windows託管的REST服務器,並讓您的Android應用程序寫入該服務器。 – MartynA
那麼,如果主應用程序關閉,我可以做些什麼,但它的服務正在運行?如果我將消息從服務發送到應用程序(如Intent或其他人),應用程序將運行,而我不需要它。 –