#objective-c #cocoa #nsarray #gdata-api
#objective-c #какао #nsarray #gdata-api
Вопрос:
Я использую Google contact data objective c API для извлечения контактов. Я получил массив контактов с сервера Google, теперь я хочу записать контакт в файл. я использую writeToFile:atomically:
метод для записи массива в файл, но этот метод у меня не работает, поскольку я чувствую, что выходной массив из gdata API не содержит объектов списка свойств. Пожалуйста, предложите любое альтернативное решение.
-(void)fetchData{
GDataServiceGoogleContact *service=[[GDataServiceGoogleContact alloc] init];
[service setShouldCacheResponseData:YES];
[service setServiceShouldFollowNextLinks:YES];
[service setUserCredentialsWithUsername:[mUsername stringValue] password:[mPassword stringValue]];
// GENERATING THE URL
NSURL *feedURL=[GDataServiceGoogleContact contactFeedURLForUserID:kGDataServiceDefaultUser];
GDataQuery *contQuery=[GDataQueryContact contactQueryWithFeedURL:feedURL];
[contQuery setShouldShowDeleted:YES];
[contQuery setMaxResults:2000];
GDataServiceTicket *ticket=[service fetchFeedWithQuery:contQuery delegate:self didFinishSelector:@selector(hasFetchedContacts:feed:error:)];
}
-(void) hasFetchedContacts:(GDataServiceTicket*) ticket feed:(GDataFeedContact*) contacts error:(NSError*) err
{
NSArray *contactList=[contacts entries];
NSLog(@"%d",[list writeToFile:@"/Users/subhranil/Desktop/contactList" atomically:NO]);
}
Комментарии:
1. возможно, вы можете обернуть объекты в пользовательский класс, соответствующий
NSCoding
протоколу2. Вы посмотрели на мой ответ?
Ответ №1:
Оберните его в NSData с помощью:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:contactList];
Затем сохраните NSData в файл с:
[data writeToFile:@"/Users/subhranil/Desktop/contactList" atomically:NO];
Позже вы можете восстановить данные обратно в NSArray с помощью:
NSData *data = [NSData dataWithContentsOfFile: @"yourFilePath"];
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]
Просто убедитесь, что объекты внутри вашего NSArray
соответствуют NSCoding
.
Комментарии:
1. В моем случае это не сработает, потому что GDataEntryContact не поддерживает архивирование.
Ответ №2:
Вы можете использовать byte
array для этой цели и NSData
для записи в файл.
Для сохранения:
NSData *data=[[NSData alloc] initWithBytes:[contacts entries] length:total];
[data writeToFile:@"path" atomically:YES];
total= общий размер массива в байтах
Для извлечения:
NSData *newdata = [NSData dataWithContentsOfFile:@"path"];
NSUInteger len = [newdata length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [newdata bytes], len);
byteData
теперь будет содержать массив объектов GDataEntryContact, и вы можете использовать их соответствующим образом.
Ответ №3:
Вы можете кодировать / декодировать GDataObject, используя xml в качестве генератора.
Кодировать:
[entry setNamespaces:[entry completeNamespaces]];
NSString *xml = [[entry XMLElement] XMLString];
if (nil != xml)
{
//Store your xml NSString to a file
}
Декодировать:
NSString *xml = //Read your XML String from file;
NSXMLElement *xmlElement = [[NSXMLElement alloc] initWithXMLString:xml error: amp;error];
if (!error) {
return [[GDataEntryDocBase alloc] initWithXMLElement:xmlElement parent: nil];
}
Комментарии:
1. Вы уверены? Это решение, лично предложенное мне создателем API. Я также попытался реализовать это, и это работает. В чем именно проблема?
2. запись является общим объектом GDataEntryBase. Например, один GDataEntryContactBase (элемент из GDataFeedContact).