SyncAdapter 可以修改另一个 SyncAdapter 添加的 RawContacts 吗?

Can a SyncAdapter modify RawContacts added by another SyncAdapter?

如果帐户 A 的 SyncAdapter A 在 ContactsContract.RawContacts table 中创建原始联系人,帐户 B 的 SyncAdapter B 是否可以更新 SyncAdapter A 添加的 RawContact。

特别感兴趣的是 sync1 或原始联系人中的任何同步字段 table?

如果这是可能的,结果可能会出现什么问题。

任何人都可以展示应该如何完成的示例吗?

Contacts 数据库上没有每个联系人权限模型,每个应用程序和每个 SyncAdapter 具有 Contacts 权限的人都可以 read/write 到任何字段任何联系人。

但是,RawContact 下的 syncX 字段被拥有者 SyncAdapter 用于专有目的(例如,跟踪哪些联系人需要同步,哪个是脏的,何时它是上次同步的,后端联系人 ID 值等),因此请确保您不要触摸任何您不知道它的用途的东西,否则您可能会冒损坏某些联系人的风险。

要修改 ID 1234RawContact 上的 Sync1 值,请执行:

ContentResolver cr = context.getContentResolver();
ContentValues values = new ContentValues(2);
values.put(RawContacts.SYNC1, "Hello World");
cr.update(RawContacts.CONTENT_URI, values, RawContacts._ID + "=" + 1234, null);

UPDATE - 批量更新

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

ops.add(ContentProviderOperation.newUpdate(RawContacts.CONTENT_URI)
      .withSelection(RawContacts._ID + "=" + 1234, null)
      .withValue(RawContacts.SYNC1, "Hello")
      .build());
ops.add(ContentProviderOperation.newUpdate(RawContacts.CONTENT_URI)
      .withSelection(RawContacts._ID + "=" + 5678, null)
      .withValue(RawContacts.SYNC1, "World")
      .build());

getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);