2016-12-23 15 views
0

クライアントとサーバーのデータをバックグラウンドで同期させるために、1 - syncアダプタが作成されました。それはアプリとは異なるプロセスとして実行されます。同期アダプタを使用してサーバからアンドロイドSQLiteにデータを同期する方法は?

2 - SQLiteのは、これら2つの点を考慮すると、複数のプロセスによって

を書き込むことができません、どのように私はSQLiteデータベースにサーバーから解析されたデータを書き込むことになってんですか?このシナリオでContentProviderは動作しますか?これは唯一のオプションですか?

ps。私がここで見つけたすべての答えは、複数のスレッドからの読み書きに関するものです。この場合、Android実装(SQLiteOpenHelperを使用)は単一のdb接続へのアクセスをシリアル化します。私の問題は、同期アダプタがアプリケーションとは別のプロセスとして実行されるため、Javaコードを使って同期することが不可能になることです。

答えて

0

ContentProviderは、あなたの目的に完全に適合します。それはあなたのためのIPCを処理します。 私は、このような方法でそれを作った:

@Override 
    public void onPerformSync(Account account, Bundle bundle, String s, ContentProviderClient contentProviderClient, SyncResult syncResult) { 
     try { 
      ResponseModel response = getAllData(deviceId); 
      if (response != null) { 
       addDataToDatabase(contentProviderClient, response); 
      } 
     } catch (RemoteException | RetrofitError exception) { 
      e.printStackTrace(); 
     } 
    } 

private void addDataToDatabase(ContentProviderClient contentProviderClient, ResponseModel response) throws RemoteException { 
     addTasks(contentProviderClient, response); 
    } 

    private void addTasks(ContentProviderClient contentProviderClient, ResponseModel response) throws RemoteException { 
     if (response.getTasks() != null) { 
      int size = response.tasksContentValues().size(); 
      contentProviderClient.bulkInsert(TaskTable.CONTENT_URI, 
        response.tasksContentValues().toArray(new ContentValues[size])); 
     } 
    } 
+0

は、私は、バックグラウンド・プロセスのためだけのContentProviderを使用して、アプリ内で直接SqliteDatabaseを使用し続けることはできますか?それとも内部的にContentProviderを使うべきですか? – Gus

+0

SyncAdapterを使用する場合は、ContentProviderが必要です。しかしここで述べたようにダミーのContentProviderを使うことができます:http://stackoverflow.com/questions/4649808/syncadapter-without-a-contentprovider –

+0

これは問題です。私は既にダミーのContentProviderでSyncAdapterを使用しています。しかし、SyncAdapterは別のプロセスとして開始されるため、データベースへのアクセスは同期されないため、バッチの実行と同時にアプリケーションを使用している間、すべてのエラーが発生します。 – Gus

関連する問題