Сборка NSObject для сохранения данных ABRecordRef локально - PullRequest
2 голосов
/ 22 августа 2011

Я хочу сохранить Content из ABRecordRef в моем собственном Приложении независимо от записи в AdressBook.После кросс-чтения через stackoverflow и сайт разработчиков 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 Ответ

0 голосов
/ 03 июня 2014

Изучите использование 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

...