尝试从公共Google电子表格中读取数据时出现NullPointerExceptions

时间:2015-04-26 20:09:30

标签: java android eclipse google-spreadsheet-api gdata-api

我正在尝试使用谷歌电子表格作为Android中的简单数据库。但是当我拨打电子表格时,我得到了NullpointerExeptions 当我试图获取工作表的大小时,它返回0。 例如,当我调用getAllCells()时,我得到一个NullpointerExeption。 感谢您提供的任何帮助/建议。

(我将电子表格发布到网络任何有链接的人都可以编辑

这是电子表格https://docs.google.com/spreadsheets/d/1arJFUxSghwdv0QpnJJ3lBu36X4I3d_uB4xx_xNGLKHU/edit#gid=0

这是小项目https://drive.google.com/file/d/0B36AnWs56yGIdVFpdzNxSE9BSlU/view?usp=sharing

的zip文件

这是apk https://drive.google.com/file/d/0B36AnWs56yGITkIyUGpJcHpuUlk/view?usp=sharing

这是错误

java.lang.NullPointerException
1at com.google.gdata.data.spreadsheet.WorksheetEntry.getFeedUrlString(WorksheetEntry.java:133)
2at com.google.gdata.data.spreadsheet.WorksheetEntry.getCellFeedUrl(WorksheetEntry.java:113)
3at com.example.tempo.util.SpDatabase.getAllCells(SpDatabase.java:67)
4at com.example.tempo.TempoMain.testDataBase(TempoMain.java:101)
5at com.example.tempo.TempoMain$1$1.doOnBackground(TempoMain.java:70)
6at com.example.tempo.util.AsyncJob$2.run(AsyncJob.java:59)
7at java.lang.Thread.run(Thread.java:841)

这是我用来访问它的java类

package com.example.tempo.util;
import android.widget.Toast;

import com.google.gdata.client.spreadsheet.*;
import com.google.gdata.data.spreadsheet.*;
import com.google.gdata.util.*;

import java.io.IOException;
import java.net.*;
import java.util.*;



public class SpDatabase {

    WorksheetEntry worksheet;
    SpreadsheetService service;
    String spTitle;

    public SpDatabase()throws AuthenticationException, MalformedURLException, IOException, ServiceException {
                service = new SpreadsheetService("MySpreadsheetIntegration-v1");

                // TODO: Authorize the service object for a specific user (see other sections)

                // Define the URL to request.  This should never change.

                String key = "1arJFUxSghwdv0QpnJJ3lBu36X4I3d_uB4xx_xNGLKHU";


                URL SPREADSHEET_FEED_URL  = FeedURLFactory.getDefault().getWorksheetFeedUrl(key, "public", "basic");


                // Make a request to the API and get all spreadsheets.
                SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class);
                List<SpreadsheetEntry> spreadsheets = feed.getEntries();

                if (spreadsheets.size() == 0) {
                  // TODO: There were no spreadsheets, act accordingly.
                }

                // TODO: Choose a spreadsheet more intelligently based on your
                // app's needs.
                SpreadsheetEntry spreadsheet = spreadsheets.get(0);
                spTitle = spreadsheet.getTitle().getPlainText();

                // Make a request to the API to fetch information about all
                // worksheets in the spreadsheet.
                List<WorksheetEntry> worksheets = spreadsheet.getWorksheets();
//              WorksheetEntry worksheet = worksheets.get(0);
                worksheet = worksheets.get(0);

    }

    public int getRowCount(){
        int rowCount = worksheet.getRowCount();

        return rowCount;
    }
    public int getColumnCount(){
        int columnCount = worksheet.getColCount();

        return columnCount;
    }

    public ArrayList<CellEntry> getAllCells() throws IOException, ServiceException{
          // Fetch the cell feed of the worksheet.
        URL cellFeedUrl = worksheet.getCellFeedUrl();
        CellFeed cellFeed = service.getFeed(cellFeedUrl, CellFeed.class);

        return (ArrayList<CellEntry>) cellFeed.getEntries();
    }
                            // or getRow() or getCollumn()
    public ArrayList<CellEntry> getSpecificCells(int minRow, int maxRow, int minCol, int maxCol) throws IOException, ServiceException, URISyntaxException{

        //example: Fetch column 4, and every row after row 1 --> "?min-row=2&min-col=4&max-col=4"
        String pref =  "?";
        if(minRow != -1){
            pref = appendAndIfFirstValue(pref);
            pref += "min-row=" + minRow;
        }
        if(minCol != -1){
            pref = appendAndIfFirstValue(pref);
            pref += "&min-col=" + minCol;
        }

        if(maxRow != -1){
            pref = appendAndIfFirstValue(pref);
            pref += "&max-row=" + maxRow;
        }
        if(maxCol != -1){
            pref = appendAndIfFirstValue(pref);
            pref += "&max-col=" + maxCol;
        }

          // Fetch column 4, and every row after row 1.
        URL cellFeedUrl = new URI(worksheet.getCellFeedUrl().toString() + pref).toURL();
        CellFeed cellFeed = service.getFeed(cellFeedUrl, CellFeed.class);



        return (ArrayList<CellEntry>) cellFeed.getEntries();


    }

    public int getCellNumValue(CellEntry cell){
        return (Integer) cell.getCell().getNumericValue();
    }

    public String getCellStringValue(CellEntry cell){
        return  cell.getCell().getValue();
    }


    public void incrementCellValue(CellEntry cell) throws IOException, ServiceException{
          String cellID = cell.getTitle().getPlainText();
          cell.changeInputValueLocal("=SUM(" + cellID + ", 1)");
          cell.update();

    }
    public void changeCellValue(CellEntry cell, String value) throws IOException, ServiceException{
        cell.changeInputValueLocal(value);
        cell.update();
    }
    private String appendAndIfFirstValue(String str){
        if(!str.contains("&")){
            return "&" + str;
        }else{
            return str;
        }

    }

    public String getSpreadSheetTitle() throws IOException, ServiceException, URISyntaxException{

    return spTitle;

    }

}

1 个答案:

答案 0 :(得分:1)

事实证明问题是投影的范围,并且根据文档谷歌说The spreadsheets feed only supports the 'private' visibility and the 'full' projection.

我使用的是'public''basic' 所以我解决问题的方法是直接访问工作表(它支持更多的可见性参数):

public SpDatabase()throws AuthenticationException, MalformedURLException, IOException, ServiceException {
        service = new SpreadsheetService("Test");

        FeedURLFactory factory = FeedURLFactory.getDefault();

        String key = "1arJFUxSghwdv0QpnJJ3lBu36X4I3d_uB4xx_xNGLKHU";
        URL spreadSheetUrl = factory.getWorksheetFeedUrl(key, "public", "full");
        WorksheetFeed feed = service.getFeed(spreadSheetUrl, WorksheetFeed.class);

        worksheet = feed.getEntries().get(0);
        URL cellFeedURL = worksheet.getCellFeedUrl();
        CellFeed cellFeed = service.getFeed(cellFeedURL, CellFeed.class);

}