2016-05-15 4 views
1

Ich habe eine Android-Anwendung und einen Dienst in demselben Prozess. Schreibe Code unter RAD Studio Delphi 10.1.Schreiben Sie in die SQLite-Datenbank von einem Android-Dienst in Delphi (RAD Studio)

Ich brauche geographische Koordinaten in Android Service (die ich gut mache) und schreibe sie in die SQLite-Datenbank. Und von Zeit zu Zeit kann die Anwendung (wenn der Benutzer benötigt) die Koordinaten in der Benutzeroberfläche verarbeiten.

Wenn ich TConnection (any - ADO, FireDAC, UniDAC) in DataModule nicht sogar eine aktive Verbindung herstellen, funktioniert der Dienst nicht mehr, auch nicht das OnStartCommand-Ereignis ausgeführt.

Monitor.bat zeigt keine offensichtlichen Fehler.

Bitte sagen Sie mir, wie Sie mit einer SQLite-Datenbank in Android Service und Android-Anwendung gleichzeitig arbeiten.

+0

Wenn Sie möchten, dass Ihre Sqlite auf dem Android-Gerät verwendet wird, benötigen Sie eine Edition von Sqlite, die auf Android ausgeführt wird, falls eine existiert. ADO ist Windows-nur afaik, BTW. Eine andere Möglichkeit wäre, einen Windows-gehosteten REST-Server zu schreiben und Ihre Android-App dazu zu schreiben. – MartynA

+0

Was kann ich tun, wenn die Hauptanwendung geschlossen ist, aber der Dienst läuft? Wenn ich eine Nachricht vom Dienst an die Anwendung sende (wie Intent oder jemand anderes), wird die Anwendung ausgeführt, und ich möchte sie nicht. –

Antwort

1

fand ich eine Lösung:

I aktualisiert UniDAC Komponenten für Berlin auf die neueste Version (6.3.12).

TUniConnection und TUniQuery funktionieren gut mit SQLite im Android Service.

Zum Projekt hinzufügen-> Bereitstellung der Host-Anwendung meine SQLite DB-Datei, Remote-Pfad setzt auf ". \ Assets \ interne \".

Ich hoffe, dass dieser Code für Sie nützlich ist.

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

Ich habe das gleiche Problem zu kämpfen, aber ich begann TSQLConnection (dbexpress) Komponente mit TSQLQuery (dbexpress) Komponente und diese sind Komponenten wrok auch in Android Service zu nutzen.

+0

Gute Nachrichten. Welche Version von RAD Studio verwenden Sie? –

+1

Ich benutze Delphi 10.1 Berlin, aber es war auch die Arbeit an Delphi 10 Seattle. – Lionking