在iphone中以编程方式将联系人添加到现有组

我想将ABRecordRef添加到现有的Group。 一些如何不工作。 这是我的代码:

-(void)addUsers:(NSMutableArray*)users toGroupID:(ABRecordID)groupID { CFErrorRef error = NULL; ABAddressBookRef addressBookRef = ABAddressBookCreate(); // Get Group ABRecordRef group = ABAddressBookGetGroupWithRecordID(addressBookRef,groupID); for (User *user in users) { int recordId = user.uniqID; ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBookRef,(ABRecordID)recordId); //add the new person to the record ABAddressBookAddRecord(addressBookRef, person, nil); ABAddressBookSave(addressBookRef, &error); // add the group ABAddressBookAddRecord(addressBookRef, group, &error); ABAddressBookSave(addressBookRef, &error); // add the person to the group ABGroupAddMember(group, person, &error); ABAddressBookSave(addressBookRef, &error); //save the record ABAddressBookSave(addressBookRef, nil); if (!isMemberAdded) { [self showAlertWithTitle:@"Alert" andMessage:@"Some Error Occured While Adding User to Existing Group"]; } } BOOL isMembersAddedToGroup = ABAddressBookSave(addressBookRef, nil); if (isMembersAddedToGroup) { [self showAlertWithTitle:@"Alert" andMessage:@"Selected Members Added to Existing Group Successfully"]; } else{ [self showAlertWithTitle:@"Alert" andMessage:@"Some Error Occured While Adding User to Existing Group"]; } CFRelease(addressBookRef); } 

每当我使用上面的代码并尝试将其保存在现有组中时,我会在控制台中收到以下消息

 CPSqliteStatementPerform: constraint failed for INSERT INTO ABGroupMembers (group_id, member_type, member_id) VALUES (?, ?, ?); CPSqliteStatementReset: columns group_id, member_type, member_id are not unique for INSERT INTO ABGroupMembers (group_id, member_type, member_id) VALUES (?, ?, ?); 

我没有得到上面代码中缺少的东西。 任何帮助都是值得赞赏的。 谢谢

如果我们看到消息:

 CPSqliteStatementPerform: constraint failed for INSERT INTO ABGroupMembers (group_id, member_type, member_id) VALUES (?, ?, ?); CPSqliteStatementReset: columns group_id, member_type, member_id are not unique for INSERT INTO ABGroupMembers (group_id, member_type, member_id) VALUES (?, ?, ?); 

还在文档中 :

ABAddressBook opaque类型(其实例称为地址簿)为通讯簿提供了一个编程接口 – 一个由多个应用程序用来存储有关人员个人信息的集中式数据库

(因此,在内部,此错误是由于不正确的sqlite查询引起的。)

它表示ABGroupAddMemberABAddressBookAddRecord(addressBookRef, group, &error);存在一些问题ABAddressBookAddRecord(addressBookRef, group, &error); 呼叫。

问题可能是:当我们调用ABAddressBookGetGroupWithRecordIDABAddressBookGetGroupWithRecordID函数时,我们已经有了组和人员引用。

现在,当为( person group )执行ABAddressBookAddRecord时, ABAddressBookAddRecord它们添加到addressbook不更新其UniqueIdsid for person and group ref. ),因此在ABGroupAddMember函数调用时它具有相同ID的人和group ,在ABGroupMembers表中添加。

在将其添加到地址簿之后(以及在将它们添加到组之前),请尝试打印persongroup recordId 。 如果recordsIds没有更新那么这就是原因,你需要为新的recordId获取record 。 还要检查是否将新persongroup添加到地址簿。

*目前,我没有mac访问权限validation我的建议/答案。