2016-05-15 19 views
1

私はAndroidアプリケーションとサービスを同じプロセスで使用しています。 RAD Studio Delphi 10.1でコードを記述します。デルファイのAndroidサービスからSQLiteデータベースに書き込む(RAD Studio)

(私がうまくやっている)Androidサービスで地理座標を取得し、SQLiteデータベースに書き込む必要があります。 アプリケーションは、ユーザーインターフェイスで座標を処理することができます(ユーザーが必要な場合)。

DataModuleにTConnection(any-ADO、FireDAC、UniDAC)をアクティブ接続しても、OnStartCommandイベントを実行していなくてもサービスは停止します。

Monitor.batには明らかなエラーはありません。

AndroidサービスでSQLiteデータベースを使用する方法と、Androidアプリケーションで同時に使用する方法を教えてください。

+0

AndroidデバイスにSqliteを追加したい場合は、Android上で動作するSqliteのエディションが必要です(存在する場合)。 ADOはWindowsのみafaik、btwです。もう1つの方法は、WindowsホストのRESTサーバーを作成し、それにAndroidアプリに書き込むことです。 – MartynA

+0

メインアプリケーションが終了してもサービスは実行されている場合はどうすればよいですか?サービスからアプリケーション(インテントや他の誰かのような)にメッセージを送信すると、アプリケーションが実行され、私はそれを望んでいません。 –

答えて

1

私は解決策を見つけた:

私は、最新バージョン(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; 
1

私は同じ問題を苦労してきたが、私はTSQLQueryを(dbExpressの)コンポーネントとのTSQLConnection(dbExpressの)コンポーネントを使用し始め、これらのコンポーネントは、AndroidサービスでよくWROKあります。

+0

良いニュースです。どのバージョンのRAD Studioを使用していますか? –

+1

私はDelphi 10.1 Berlinを使用していますが、Delphi 10 Seattleでも動作していました。 – Lionking

関連する問題