2016-12-23 40 views
0

1 - 同步适配器已创建,以在后台同步客户端和服务器数据。它以与应用程序不同的过程执行。如何使用同步适配器将数据从服务器同步到android SQLite?

2 - SQLite的不能被多个进程

考虑到这两点,我怎么写从服务器解析到SQLite数据库中的数据被写入? ContentProvider会在这种情况下工作吗?这是唯一的选择吗?

ps。我在这里找到的所有答案都是关于从多个线程读取/写入的。在这种情况下,Android实现(使用SQLiteOpenHelper)将序列化访问单个数据库连接。不过,我的问题是,同步适配器作为与应用程序不同的进程运行,导致无法通过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

相关问题