Как читать и обновлять строки таблицы Google Fusion, используя код JAVA - PullRequest
0 голосов
/ 05 июня 2018

(Изменить: это вопрос, который у меня возник, и я отвечаю на него в надежде помочь кому-то, у кого был похожий вопрос.)

Я пытаюсь очистить географические данные в моей таблице Google Fusion.и хотел бы написать программу на Java для чтения в отдельных строках таблицы Fusion, изменить столбцы в каждой строке и записать измененные строки обратно в исходную таблицу Fusion.

Я нашел пример кода Кристиана Джанка в GoogleДокументация клиентских библиотек API: "fusiontables-cmdline-sample" , показывающая, как: авторизовать доступ пользователей к таблицам fusion, создавать таблицы списков, создавать таблицы, вставлять данные в таблицу, показывать строки, удалять таблицы,

Как изменить этот пример, чтобы обновлять выбранные строки в таблице?(см. ответ с кодом ниже)

[править]: Я не нашел хороших решений в сети.Я написал решение на Java и отвечу в ответах в надежде, что оно может помочь кому-то еще, как он пытается это сделать.Я начинающий программист на Java, поэтому код отражает это.Мне также нужно было найти близлежащие крупные города на основе местоположения GPS и использовать GeoNames api (townsJSON) , создав для этого ограничивающий прямоугольник.Это решение использует JSON для доступа к элементам, возвращаемым из вызовов REST.

1 Ответ

0 голосов
/ 05 июня 2018

Я написал программу на Java, которая выполняет модификацию данных строки, описанную в вопросе.Он использует пример Christian Junk , отмеченный в вопросе, а также вызывает GeoNames townsJSON webservice , как описано в вопросе (отправка координат ограничивающего прямоугольника в параметрах).Я новичок в Java, поэтому код такой, какой он есть.Я много комментирую, чтобы позже повторно использовать код, например запросы SQL.

Мое решение на Github можно найти по адресу: FusionTableModifyJava Основной интересующий модуль: FusionTableSample.java Вот функции, которые выполняют getRows и updateRows.Все остальное можно увидеть на github (от Microsoft $):

private static void getRows(String tableId) throws IOException {
    View.header("Updating Rows From Table");
    /*Sql sql = fusiontables.query().sql("SELECT RowID, 'Area Name', Notes, Number FROM " + tableId +
            " Where Manager = '' AND 'Review 1' CONTAINS IGNORING CASE '.fs.' Order by Number ASC LIMIT 3000");*/
    /*Sql sql = fusiontables.query().sql("SELECT RowID, 'Area Name', Notes, Number FROM " + tableId +
            " Where 'Area Name' CONTAINS IGNORING CASE 'Tioga George' Order by Number ASC LIMIT 3000");*/
    /*Sql sql = fusiontables.query().sql("SELECT RowID, 'Area Name', Notes, Number FROM " + tableId +
            " Where 'Area Name' ='' Order by Number DESC LIMIT 2000");*/
    /*Sql sql = fusiontables.query().sql("SELECT RowID, 'Area Name', Notes, Number FROM " + tableId +
            " Where 'Area Name' CONTAINS 'X01' Order by Number DESC LIMIT 1"); */
    /*AND 'City (nearest)' DOES NOT CONTAIN IGNORING CASE 'Mexico'*/

    /*Sql sql = fusiontables.query().sql("SELECT RowID, 'Area Name', Notes, Number, Location FROM " + tableId +
            " Where State = '' Order by Number DESC LIMIT 100");*/
    /*Sql sql = fusiontables.query().sql("SELECT RowID, 'Area Name', Notes, Number, Location FROM " + tableId +
            " Where State = 'BCS' Order by Number DESC LIMIT 100");*/
    Sql sql = fusiontables.query().sql("SELECT RowID, 'Area Name', Notes, Number, Location, State, Codes FROM " + tableId +
            " Where State = 'ID' AND 'City (nearest)' = '' Order by Number DESC LIMIT 100");

    try {
        Sqlresponse response = sql.execute();
        // System.out.println(response.toPrettyString());

        mylist = response.getRows();

    } catch (IllegalArgumentException e) {
        // For google-api-services-fusiontables-v1-rev1-1.7.2-beta this exception will always
        // been thrown.
        // Please see issue 545: JSON response could not be deserialized to Sqlresponse.class
        // http://code.google.com/p/google-api-java-client/issues/detail?id=545
    }
}

private static void updateRows(String tableId) throws IOException {
    // IOException needed  ParseException
    count = 1;
    mylist.forEach((myRow) -> {
        try {
            // modify fields in table...
            //newAreaName = kt.firstpart(myRow.get(NOTES).toString()); //get Notes first sentence
            //newAreaName = newAreaName.replace("'", "''");
            //newAreaName += " X01";
            //String state = getStateFrmLoc(myRow.get(LOCATION).toString());
            //String state = "MX-BCS";
            float km;
            if ( "AK,MT,NV".contains(myRow.get(STATE).toString()) ) {
                km = 180f; // 111.85 miles
            } else {
                km = 80.5f;  // 50 miles
            }

            BigCity big = new BigCity(myRow.get(LOCATION).toString(), km);
            String cityState = big.cityName +", "+big.state;

            if (big.population < 10000f) {
                System.out.println("Skip for low population :"+myRow.get(NUMBER));
            } else {

                sqlupdate = "UPDATE " + tableId + " " +
                        "SET 'City (nearest)' = '" + cityState + "' " +
                        ",'Codes' = '" + myRow.get(CODES).toString() + ",#U1' " +
                        "WHERE ROWID = " + myRow.get(ROW_ID);
                System.out.println("[" + count + "]" + myRow.get(NUMBER) + ": " + sqlupdate);

                // do the update...
                if (!mtest) {  // if testing then don't update
                    sql_doupdate(sqlupdate);
                }
                count++;
                if ((count % 30) == 0) {
                    System.out.println("waiting 60 seconds");
                    TimeUnit.SECONDS.sleep(60); //Fusion Tables allows 30 updates then must wait 1 minute.
                }
            }
            } catch(Exception e){
                System.out.println(e.getMessage());
        }

    });

}
...