Пакетная вставка ячеек электронной таблицы с использованием gdata -jectivec-client не работает - PullRequest
0 голосов
/ 18 августа 2011

Я пытаюсь добавить группу ячеек в электронную таблицу 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 - поэтому меня не удивляет, что он не работает.

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

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

Ответы [ 2 ]

3 голосов
/ 18 августа 2011

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

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

                     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

                             }];
                        }];
                   }];
0 голосов
/ 18 августа 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}"

)

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

...