如何使用source_id引用创建组?

时间:2013-09-07 14:54:29

标签: android

更新

我终于想出了这个: 关键是要创建一个具有帐户名称和帐户类型的组,这在查看文档时并不是很明显(在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中列为列,而代码生成组为null。

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

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

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

以下是docs关于sourceid的说法:

  

字符串SOURCE_ID读/写:

     

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