2012-06-28 45 views
1

我需要以編程方式備份​​所有記錄(數字,名稱,圖像...)的所有聯繫人。我閱讀了有關AddressBook.framework的內容,但是有沒有簡單的方法來備份所有聯繫人?以編程方式備份​​完整的iPhone地址簿

+0

是的。將iPhone連接到iTunes並備份。爲什麼你需要用戶的*全部*聯繫人數據庫的任何特定原因?最近有一些主要的應用程序在這方面遇到麻煩。 – esqew

+0

這是我的應用程序想法所必需的......數據將只存儲在本地。爲什麼這應該是一個問題? – Boeringer

回答

0

這取決於您要備份的聯繫人的屬性。如果你想備份他們的名字和姓氏,請做這樣的事情:

//CREATE ARRAYS STORING FIRST NAMES AND LAST NAMES 
NSMutableArray *firstNames = [[NSMutableArray alloc] init]; 
NSMutableArray *lastNames = [[NSMutableArray alloc] init]; 

ABAddressBookRef addressBook = ABAddressBookCreate(); 
NSArray *arrayOfPeople = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); 
CFRelease(addressBook); 

for(NSUInteger index = 0; index <= ([arrayOfPeople count]-1); index++){ 

    ABRecordRef currentPerson = (__bridge ABRecordRef)[arrayOfPeople objectAtIndex: index]; 
    [firstNames addObject: (__bridge_transfer NSString *)ABRecordCopyValue(currentPerson, kABPersonFirstNameProperty)]; 
    [lastNames addObject: (__bridge_transfer NSString *)ABRecordCopyValue(currentPerson, kABPersonLastNameProperty)];   
} 

//BACKUP THE ARRAYS IN A PLIST 
NSArray *array=[NSArray arrayWithObjects: firstNames, lastNames, nil]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
NSString *location = [[paths objectAtIndex:0] stringByAppendingString:@"/somefilename.plist"]; 
[array writeToFile:location atomically:YES]; 

如果您對代碼有任何疑問,只需在評論中提問即可。希望這可以幫助!

+0

感謝您的代碼!但我想備份一個聯繫人的所有信息......我想這可能是一個簡單地把整個地址簿轉儲的功能。 – Boeringer

+0

@Boeringer我查看了地址簿框架中的類的類引用,看起來沒有一個函數可以做到這一點。但是,您可以爲聯繫人的每個條目創建一個NSMutableArray,但這會很乏味。 – pasawaya

6

1.做到這一點的一種方法是創建一個包含所有聯繫人的電子名片字符串。像這樣:

ABAddressBookRef addressBook = ABAddressBookCreate(); 
CFArrayRef peopleForBackup = ABAddressBookCopyArrayOfAllPeople(addressBook); 
CFDataRef vcards = (CFDataRef)ABPersonCreateVCardRepresentationWithPeople(peopleForBackup); 
vcardString = [[NSString alloc] initWithData:(NSData *)vcards encoding:NSUTF8StringEncoding]; 

然後將此字符串寫入文件進行備份。從地址簿

2.刪除當前聯繫人:

ABAddressBookRef addressBook = ABAddressBookCreate(); 
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); 
int arrayCount = CFArrayGetCount(people); 
ABRecordRef abrecord; 

for (int i = 0; i < arrayCount; i++) { 
    abrecord = CFArrayGetValueAtIndex(people, i); 
    ABAddressBookRemoveRecord(addressBook,abrecord, NULL); 
} 
CFRelease(people); 

3.To從備份恢復您剛剛通過虛擬卡的人,記錄讀取vCard文件轉換成字符串和itterate,並將其添加爲記錄到地址簿,然後保存。

ABAddressBookRef addressBook = ABAddressBookCreate(); 
NSData *stringData = [NSData dataWithContentsOfFile:contactFilePath]; 
NSString *vcardFromFile = [[NSString alloc] initWithData:stringData encoding:NSUTF8StringEncoding]; 

CFDataRef vCardData = (CFDataRef)[vcardFromFile dataUsingEncoding:NSUTF8StringEncoding]; 

ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(addressBook); 
CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData); 

for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) { 
    ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index); 
    ABAddressBookAddRecord(addressBook, person, NULL); 
    CFRelease(person); 
} 

CFRelease(vCardPeople); 
CFRelease(defaultSource); 
bool success = ABAddressBookSave(addressBook, NULL); 

這種方法的一個問題是,我不知道一種方法來維護聯繫人(交換,臉譜...)的鏈接。

相關問題