数据从SQLite中取出后直接存到联系人列表里出现了这个问题:
sqlite中C语言char类型字符,在ABAddressbook中的这个方法中无法识别,需要转换为CFStringRef类型
ABRecordSetValue(tmpRecord, kABPersonFirstNameProperty, tmpFirstName, &error);
转换方法:
CFStringRef tmpFirstName =CFStringCreateWithCString(NULL, firstName_c, kCFStringEncodingUTF8);
代码示例:
- (void)addContacts
{
NSString *sqlQuery = [NSString stringWithFormat:@"SELECT * FROM %@",dbBackupContactsInfoTable];
sqlite3_stmt * statement;
if (sqlite3_prepare_v2(CDB, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW)
{
char *firstName_c = (char*)sqlite3_column_text(statement, 1);
char *lastName_c = (char*)sqlite3_column_text(statement, 2);
char *phoneNum_c =(char*)sqlite3_column_text(statement, 3);
ABAddressBookRef tmpAddressBook = ABAddressBookCreate();
ABRecordRef tmpRecord = ABPersonCreate();
CFErrorRef error;
BOOL tmpSuccess = NO;
//First name
CFStringRef tmpFirstName =CFStringCreateWithCString(NULL, firstName_c, kCFStringEncodingUTF8);
tmpSuccess = ABRecordSetValue(tmpRecord, kABPersonFirstNameProperty, tmpFirstName, &error);
CFRelease(tmpFirstName);
//Last name
CFStringRef tmpLastName = CFStringCreateWithCString(NULL, lastName_c, kCFStringEncodingUTF8);
tmpSuccess = ABRecordSetValue(tmpRecord, kABPersonLastNameProperty, tmpLastName, &error);
CFRelease(tmpLastName);
//phone number
CFTypeRef tmpPhones = CFStringCreateWithCString(NULL, phoneNum_c, kCFStringEncodingUTF8);;
ABMutableMultiValueRef tmpMutableMultiPhones = ABMultiValueCreateMutable(kABPersonPhoneProperty);
ABMultiValueAddValueAndLabel(tmpMutableMultiPhones, tmpPhones, kABPersonPhoneMobileLabel, NULL);
tmpSuccess = ABRecordSetValue(tmpRecord, kABPersonPhoneProperty, tmpMutableMultiPhones, &error);
CFRelease(tmpPhones);
//保存记录
tmpSuccess = ABAddressBookAddRecord(tmpAddressBook, tmpRecord, &error);
CFRelease(tmpRecord);
//保存数据库
tmpSuccess = ABAddressBookSave(tmpAddressBook, &error);
CFRelease(tmpAddressBook);
}
}
sqlite3_close(CDB);
}