Сборка NSObject для сохранения локальных данных ABRecordRef
Я хочу хранить Content
из ABRecordRef
в моем собственном приложении независимо от записи в AdressBook
, После кросс-чтения через stackru и сайт разработчиков Apple, я обнаружил, что это лучший способ:
Если бы это правильно, нужно NSCoding
соответствовать NSObject
подкласс со всеми значениями ABRecordRef
и хотя бы функции initWithABRecordRef
а также getABRecordRefFromPeopleData
(если предположить, что его класс называет peopleData), где initWithABRecordRef
заполнил бы все значения из ABRecordRef
(если не ноль) в экземпляр собственного класса и getABRecordRefFromPeopleData
возвращает ABRecordRef
непрозрачный тип с данными, хранящимися в экземпляре собственного класса.
Мой вопрос к этому:
Интересно, кто-то там уже сделал это, потому что, как я понимаю, другие люди уже сталкивались с такой же проблемой раньше. Если так, то получить руки на этот класс было бы здорово, если нет, то я собираюсь попробовать его самостоятельно и загрузить результаты здесь, если это необходимо. Может быть, вы даже знаете лучший способ сделать это?
Если вы внедрили решение, поделитесь им. Если вам нужно то же самое, я был бы признателен за это вместе.
Редактировать:
Теперь я начал работать над этим и (как я и ожидал) столкнулся с некоторыми неясными проблемами. Что касается kABStringPropertyType
Ценности моя концепция довольно проста. Небольшой пример:
@implementation RealRecord
@synthesize firstName; //NSString
- (id)initWithRecordRef:(ABRecordRef)record{
//Single valued entrys
NSString *contactName = (NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty);
firstName=contactName;
[contactName release];
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder{
//single value entrys
self.firstName= [aDecoder decodeObjectForKey:@"firstName"];
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:firstName forKey:@"firstName"];
}
- (ABRecordRef)returnABRecordRefFromRealRecord{
ABRecordRef returnRecord =ABPersonCreate();
ABRecordSetValue(returnRecord, kABPersonFirstNameProperty, firstName, NULL);
return returnRecord;
}
Это отлично работает. Теперь я не совсем понимаю, как сделать то же самое с kABMultiStringPropertyType
Я сделал меня NSMutableArray
emailList и продолжал так:
- (id)initWithRecordRef:(ABRecordRef)record{
//Multi valued entrys
ABMutableMultiValueRef email=ABRecordCopyValue(record, kABPersonEmailProperty);
for (int i = 0; i < ABMultiValueGetCount(email); i++) {
NSString *anEmail = [(NSString*)ABMultiValueCopyValueAtIndex(email, i) autorelease];
[emailList addObject:anEmail];
}
return self;
}
Теперь я не уверен, как выполнить остальные задачи для нескольких значений. Могу ли я просто закодировать и декодировать NSMutableArray, как я это сделал со строками, или мне нужно установить ключ для всех писем в emailList
?
И как мне вернуть эту чертову вещь в returnRecord?
1 ответ
Изучите использование libsqlite3.dylib и создайте базу данных sql, которая будет обращаться к плоским файлам, созданным для всех свойств.
Пример iOS проекта с библиотекой sqlite3 находится здесь:
http://www.techotopia.com/index.php/An_Example_SQLite_based_iOS_7_Application
Подробно о том, как это сделать с помощью ABAddressbook, для свойств многозначного контакта здесь:
http://linuxsleuthing.blogspot.com/2012/10/addressing-ios6-address-book-and-sqlite.html