我目前正在开发一个Android项目,我希望将移动联系人同步到服务器,在研究了很多关于SyncAdapter
和在accountmanager
中创建帐户之后,我自己就学会了。然而,有两件事我不明白,我在谷歌搜索这些,但无法得到完美的答案。请不要复制这个问题,我想更清楚地知道它是如何工作的。
Ex: - 在下面的示例中,我想将一个包发送到服务器。
Bundle extras = new Bundle();
extras.putInt("contact name after filtering", "number after filtering");
ContentResolver.requestSync(account,ContactsContract.AUTHORITY, extras);
然后在onPerformSync
方法上收到Bundle附加内容并发送到服务器。
@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
for (String key : extras.keySet())
{
Log.d("Bundle Debug", key + " = \"" + extras.get(key) + "\"");
}
//Code to send to server
}
让我们在上面的示例中说,变量extras是在过滤联系人列表中的更改后获得的bundle,想要将它们更新到server.Now SyncAdapter框架或OS如何检测更改并更新脏那个联系人的旗帜?我当然提供AUTHORITY
,但不知道这有助于找到改变的内容。以上方法是否正确实施?
答案 0 :(得分:1)
在Uri上没有CALLER_IS_SYNC_ADAPTER
的情况下对联系人进行的每次修改都会使ContentProvider将修改过的联系人的DIRTY
标志设置为1
。同样,没有该参数的每个删除请求都只会设置DELETED
标志,而不是删除联系人。
您的SyncAdapter必须查询标记为脏的联系人或DELETED
,采取适当的操作(将新的联系人数据发送到服务器或从服务器删除联系人)并清除脏标志(通过覆盖如果0
具有CALLER_IS_SYNCADAPTER
参数,则可以通过再次删除联系人来完成删除(再次使用CALLER_IS_SYNCADAPTER
参数)。
我认为您不能通过将DELETED
设置为0
来“取消删除”联系人,因为(根据我的经验)此时联系人数据已被删除。只剩下RawContact条目(但是,当我最后一次尝试时,我可能只是一个行为不端的设备)。
指定CALLER_IS_SYNCADAPTER
非常重要,否则不会发生任何事情(并且您的SyncAdapter注定会一次又一次尝试同步这些联系人。)
关于问题2:
这完全取决于您的SyncAdapter。您编写代码以同步联系人,并且您是SyncAdapter是唯一可以判断它是否成功的人。一般情况下,如果在同步过程中没有抛出异常,您可能会认为它成功了。