在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查询引起的。)
它表示ABGroupAddMember
或ABAddressBookAddRecord(addressBookRef, group, &error);
存在一些问题ABAddressBookAddRecord(addressBookRef, group, &error);
呼叫。
问题可能是:当我们调用ABAddressBookGetGroupWithRecordID
和ABAddressBookGetGroupWithRecordID
函数时,我们已经有了组和人员引用。
现在,当为( person
group
)执行ABAddressBookAddRecord
时, ABAddressBookAddRecord
它们添加到addressbook
但不更新其UniqueIds ( id for person and group ref.
),因此在ABGroupAddMember
函数调用时它具有相同ID的人和group
,在ABGroupMembers
表中添加。
在将其添加到地址簿之后(以及在将它们添加到组之前),请尝试打印person
和group
recordId
。 如果recordsIds
没有更新那么这就是原因,你需要为新的recordId
获取record
。 还要检查是否将新person
和group
添加到地址簿。
*目前,我没有mac访问权限validation我的建议/答案。