Пакетная вставка ячеек электронной таблицы с использованием gdata-objectivec-client не работает

Я пытаюсь добавить пакет ячеек в электронную таблицу Google с помощью клиента GData Objective-C, как описано здесь: http://code.google.com/p/gdata-objectivec-client/wiki/GDataObjCIntroduction#Batch_requests.

Вот интересующий код:

                      GDataFeedSpreadsheetCell *batchFeed = [GDataFeedSpreadsheetCell spreadsheetCellFeed];
                  NSURL *batchUrl = [[batchFeed batchLink] URL];

                  NSMutableArray *cells = [NSMutableArray array];

                  GDataSpreadsheetCell *cell = [GDataSpreadsheetCell cellWithRow:1 column:1 inputString:@"test" numericValue:nil resultString:nil];

                  GDataEntrySpreadsheetCell *cellEntry = [GDataEntrySpreadsheetCell spreadsheetCellEntryWithCell:cell];
                  [cells addObject:cellEntry];                      
                  [batchFeed setEntries:cells];

                  GDataBatchOperation *op;
                  op = [GDataBatchOperation batchOperationWithType:kGDataBatchOperationInsert];
                  [batchFeed setBatchOperation:op];

                  [service fetchFeedWithBatchFeed:batchFeed forBatchFeedURL:batchUrl completionHandler:nil];

Не работает. Ясно, что fetchFeedWithBatchFeed не имеет ссылки на мой объект GDataWorksheetEntry, поэтому меня не удивляет, что он не работает.

Что я упускаю?

Заранее спасибо.


person Erik    schedule 17.08.2011    source источник
comment
Как я уже упоминал, я считаю, что проблема в том, что я не предоставил ссылку на свой объект GDataEntryWorksheet. Я подозреваю, что пакетный канал каким-то образом должен быть получен из этого объекта, но я не вижу способа предоставить канал ячеек из моего объекта записи рабочего листа.   -  person Erik    schedule 18.08.2011


Ответы (2)


И вот окончательный ответ.

Вы должны выполнить запрос перед пакетным обновлением, чтобы получить записи, которые вы собираетесь обновить. Оглядываясь назад, кажется очевидным. Конечно, много вложенных блоков.

                     NSURL *cellsFeedUrl = [[worksheetEntry cellsLink] URL];

                  GDataQuerySpreadsheet *querySpreadsheet = [GDataQuerySpreadsheet spreadsheetQueryWithFeedURL:cellsFeedUrl];
                  [querySpreadsheet setMinimumRow:1];
                  [querySpreadsheet setMaximumRow:1];
                  [querySpreadsheet setMinimumColumn:1];
                  [querySpreadsheet setMaximumColumn:7];
                  [querySpreadsheet setShouldReturnEmpty:TRUE];

                  [service fetchFeedWithQuery:querySpreadsheet completionHandler:
                   ^(GDataServiceTicket *ticket, GDataFeedBase *feed, NSError *error) {

                       // Update one of these cells as a test.
                       GDataEntrySpreadsheetCell *spreadsheetCellEntry = [[feed entries] lastObject];
                       [[spreadsheetCellEntry cell] setInputString:@"test"];

                       NSArray *updatedEntries = [feed entries];
                       NSString *eTag = feed.ETag;

                       // Get worksheet cells feed
                       [service fetchFeedWithURL:cellsFeedUrl completionHandler:
                        ^(GDataServiceTicket *ticket, GDataFeedBase *feed, NSError *error) {

                            NSURL *batchUrl = [[feed batchLink] URL];
                            GDataFeedSpreadsheetCell *batchFeed = [GDataFeedSpreadsheetCell spreadsheetCellFeed];

                            [batchFeed setEntriesWithEntries:updatedEntries];

                            GDataBatchOperation *op;
                            op = [GDataBatchOperation batchOperationWithType:kGDataBatchOperationUpdate];
                            [batchFeed setBatchOperation:op];
                            [batchFeed setETag:eTag];

                            // Perform batch update
                            [service fetchFeedWithBatchFeed:batchFeed forBatchFeedURL:batchUrl
                                          completionHandler:
                             ^(GDataServiceTicket *ticket, GDataFeedBase *feed, NSError *error) {

                                 // no op

                             }];
                        }];
                   }];
person Erik    schedule 18.08.2011

Я решил эту проблему и обнаружил новую проблему.

Во-первых, решение. Если у вас есть GDataWorksheetEntry, этот код выполнит пакетную операцию - в данном случае вставку:

                      NSURL *cellsFeedUrl = [[worksheetEntry cellsLink] URL];

                  // Get worksheet cells feed
                  [service fetchFeedWithURL:cellsFeedUrl completionHandler:
                   ^(GDataServiceTicket *ticket, GDataFeedBase *feed, NSError *error) {

                       NSURL *batchUrl = [[feed batchLink] URL];
                       GDataFeedSpreadsheetCell *batchFeed = [GDataFeedSpreadsheetCell spreadsheetCellFeed];

                       NSMutableArray *cells = [NSMutableArray array];

                       GDataSpreadsheetCell *cell = [GDataSpreadsheetCell cellWithRow:1 column:1 inputString:@"test" numericValue:nil resultString:nil];

                       GDataEntrySpreadsheetCell *cellEntry = [GDataEntrySpreadsheetCell spreadsheetCellEntryWithCell:cell];

                       static unsigned int staticID = 0;
                       NSString *batchID = [NSString stringWithFormat:@"batchID_%u", ++staticID];
                       [cellEntry setBatchIDWithString:batchID];

                       [cells addObject:cellEntry];                      
                       [batchFeed setEntriesWithEntries:cells];

                       GDataBatchOperation *op;
                       op = [GDataBatchOperation batchOperationWithType:kGDataBatchOperationInsert];
                       [batchFeed setBatchOperation:op];

                       [service fetchFeedWithBatchFeed:batchFeed forBatchFeedURL:batchUrl
                                     completionHandler:
                        ^(GDataServiceTicket *ticket, GDataFeedBase *feed, NSError *error) {

                            NSLog(@"FEED ENTRIES: %@",[feed entries]);
                            NSLog(@"ERROR: %@",error);

                        }];
                   }];

К сожалению, когда вы получите доступ к полученному пакетному каналу (выполненному в операторе регистрации), вы увидите следующее:

FEED ENTRIES: (
"GDataEntrySpreadsheetCell 0x5fcf510: {v:3.0 title:Error content:Insert not supported on batch. id:batchID_2 batchID:batchID_2 batchStatus:501}"

)

Итак, теперь мне нужно выяснить, как обойти отсутствие поддержки Google для пакетной вставки.

Обратите внимание, что если вы измените операцию обновления, вы получите следующее:

FEED ENTRIES: (
"GDataEntrySpreadsheetCell 0xae73880: {v:3.0 title:Error content:Missing entry id id:batchID_2 batchID:batchID_2 batchStatus:400}"

)

Отсутствующий идентификатор записи связан с тем, что я создал ячейку без ссылки на существующую ячейку, поэтому я сосредоточусь на попытке предоставить эту ссылку и предоставить вызов пакетного обновления вместо вызова пакетной вставки.

person Erik    schedule 18.08.2011
comment
Привет. Вы нашли решение этого вопроса? - person Adri; 22.05.2012