2011-08-17 42 views
0

我想使用GData Objective-C客户端将一批单元格添加到Google Spreadsheet中,如下所述:http://code.google.com/p/gdata-objectivec-client/wiki/GDataObjCIntroduction#Batch_requests使用gdata-objectivec-client无法正常工作批量插入电子表格单元格

这里是感兴趣的代码:

     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对象 - 所以它并没有让我感到惊讶,它不工作。

我要抛弃什么?

在此先感谢。

+0

正如我所提到的,我认为问题在于我没有提供对我的GDataEntryWorksheet对象的引用。我怀疑批处理源不得不从这个对象派生,但我没有看到从我的工作表入口对象提供单元提要的方式。 – Erik

回答

3

这里是最终答案。

您必须在批量更新之前执行查询以获取要更新的条目。听起来很明显回想起来。虽然确实会造成很多嵌套块。

     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

我解决了这个问题,并暴露出一个新问题。

一,解决方案。一旦你有一个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}" 

所以现在我需要找出如何围绕谷歌的缺乏批量插入支持破解。

请注意,如果您更改操作来更新你得到这个:

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

丢失的条目ID是因为我没有创建引用现有细胞的细胞 - 所以我将重点试图提供该引用并提供批量更新调用而不是批量插入调用。

+0

嗨。你找到了这个问题的解决方案吗? – Adri