0

更新

我终于想通了:关键是创建具有帐户名称和帐户类型的组,这在查看文档时并不明显(ContactsContract.Groups 中没有具有这些名称的字段,它们位于 SyncColumns 中) . 当您使用这两个值创建组时,同步过程将为您生成 source_id,此时您可以使用组行 id 或 source_id 添加成员。

如果有人需要,这是一些示例代码。

    ContentValues values = new ContentValues(); 
    values.put(ContactsContract.Groups.TITLE,"yourGroupName");
    values.put(ContactsContract.Groups.ACCOUNT_TYPE,"com.google");
    values.put(ContactsContract.Groups.ACCOUNT_NAME,"someuser@gmail.com");
    values.put(ContactsContract.Groups.GROUP_VISIBLE,1);
    context.getContentResolver().insert(ContactsContract.Groups.CONTENT_URI, values);

然后添加成员:

values = new ContentValues();
values.put(ContactsContract.CommonDataKinds.GroupMembership.MIMETYPE,ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.GroupMembership.RAW_CONTACT_ID, 22);
//values.put(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID,  56);
// the above or 
values.put(ContactsContract.CommonDataKinds.GroupMembership.GROUP_SOURCE_ID,"sourceIdthatIsFilledInAfterSync");
//context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI,values);

原始问题: 我一直在努力解决与同步组成员资格相关的问题,并认为我找到了原因,但我不知道如何解决它。

创建 2 个组后,一个通过手动编码另一个组,然后使用这些列查询组。

private final static String[] GROUP_COLUMNS = {
    ContactsContract.Groups._ID,
    ContactsContract.Groups.DATA_SET,
    ContactsContract.Groups.NOTES,
    ContactsContract.Groups.SYSTEM_ID,
    ContactsContract.Groups.GROUP_VISIBLE,
    ContactsContract.Groups.DELETED,
    ContactsContract.Groups.SHOULD_SYNC,
    ContactsContract.Groups.SOURCE_ID,
    ContactsContract.Groups.TITLE   
};

我可以这样转储结果。

: --- begin ---
: key =  title , value = myNewTestGroup
: key =  data_set , value = null
: key =  _id , value = 45
: key =  sourceid , value = null
: key =  group_visible , value = 1
: key =  system_id , value = null
: key =  should_sync , value = 1
: key =  notes , value = myNewTestGroup
: key =  deleted , value = 0
: --- end ---

: --- begin ---
: key =  title , value = Mytest2
: key =  data_set , value = null
: key =  _id , value = 46
: key =  sourceid , value = 144c8b8d0cca8a52
: key =  group_visible , value = 1
: key =  system_id , value = null
: key =  should_sync , value = 1
: key =  notes , value = Mytest2
: key =  deleted , value = 0
: --- end ---

手动创建的组 (Mytest2) 有一个 souceid,它在 ContactsContract.SyncColumns 中列为一列,而代码生成的组为空。

我在 android 文档中的可能位置看到了对 source_id 的引用,但我看不到如何获得一个。

我想如果我将该组与一个帐户相关联,我会以某种方式得到这个。有谁知道如何将组与帐户关联,或者以其他方式设置此源 ID 字段?

4

2 回答 2

2

我终于想通了:关键是创建具有帐户名称和帐户类型的组,这在查看文档时并不明显(ContactsContract.Groups 中没有具有这些名称的字段,它们位于 SyncColumns 中) . 当您使用这两个值创建组时,同步过程将为您生成 source_id,此时您可以使用组行 id 或 source_id 添加成员。

如果有人需要,这是一些示例代码。

ContentValues values = new ContentValues(); 
values.put(ContactsContract.Groups.TITLE,"yourGroupName");
values.put(ContactsContract.Groups.ACCOUNT_TYPE,"com.google");
values.put(ContactsContract.Groups.ACCOUNT_NAME,"someuser@gmail.com");
values.put(ContactsContract.Groups.GROUP_VISIBLE,1);
context.getContentResolver().insert(ContactsContract.Groups.CONTENT_URI, values);

然后添加成员:

values = new ContentValues();
values.put(ContactsContract.CommonDataKinds.GroupMembership.MIMETYPE,ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.GroupMembership.RAW_CONTACT_ID, 22);
//values.put(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID,  56);
// the above or 
values.put(ContactsContract.CommonDataKinds.GroupMembership.GROUP_SOURCE_ID,"sourceIdthatIsFilledInAfterSync");
context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI,values);
于 2013-09-08T22:07:49.513 回答
1

sourceid 中的数据仍然需要在第二个示例中设置,然后才能检索它。

以下是文档对 sourceid 的评价:

字符串 SOURCE_ID 读/写:

将此行唯一标识到其源帐户的字符串。通常它是在插入原始联系人时设置的,之后永远不会更改。一个值得注意的例外是一个新的原始联系人:它将有一个帐户名称和类型(可能还有一个数据集),但没有源 ID。这向同步适配器表明需要在服务器端创建一个新联系人,并且其 ID 存储在手机上相应的 SOURCE_ID 字段中。

于 2013-09-07T15:02:52.427 回答