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]));
}
}
我可以使用ContentProvider的唯一的后台进程,并保持直接在应用程序中使用SqliteDatabase?或者我也应该在内部使用ContentProvider? – Gus
如果您将使用SyncAdapter,则必须拥有ContentProvider。但是你可以使用这里提到的虚拟ContentProvider:http://stackoverflow.com/questions/4649808/syncadapter-without-a-contentprovider –
这就是问题所在,我已经使用带有虚拟ContentProvider的SyncAdapter。但是,当SyncAdapter作为一个不同的进程启动时,对数据库的访问不会同步,因此在批处理执行的同时使用应用程序时会出现各种错误。 – Gus