我一直试图在我的应用程序中构建一些功能,也允许将用户生成的数据(EEG记录)发送到中央BigQuery数据库。
之前我从未在Java中使用过任何网络代码,因此我避免使用推荐的基于POST或REST的策略here。 BigQuery Java client library似乎正是我所需要的,尽管我完全感到困惑,为什么它不能正式支持Android。
尽管如此,我还是偶然发现了example Android app(来自谷歌),它承诺完全符合我对BigQuery Client库的要求。我将它合并到我的应用程序中如下:
// .... in an AsyncTask
@Override
protected String doInBackground(String... params) {
String CSV_CONTENT = params[0];
try {
AssetManager am = MainApplication.getInstance().getAssets();
InputStream isCredentialsFile = am.open(CREDENTIALS_FILE);
BigQuery bigquery = BigQueryOptions.builder()
.authCredentials(AuthCredentials.createForJson(isCredentialsFile))
.projectId( PROJECT_ID )
.build().service();
TableId tableId = TableId.of(DATASET,TABLE);
Table table = bigquery.getTable(tableId);
int num = 0;
Log.d("Main", "Sending CSV: ");
WriteChannelConfiguration configuration = WriteChannelConfiguration.builder(tableId)
.formatOptions(FormatOptions.csv())
.build();
try (WriteChannel channel = bigquery.writer(configuration)) {
num = channel.write(ByteBuffer.wrap(CSV_CONTENT.getBytes(StandardCharsets.UTF_8)));
} catch (Exception e) {
Log.d("Main", e.toString());
}
Log.d("Main", "Loading " + Integer.toString(num) + " bytes into table " + tableId);
} catch (Exception e) {
Log.d("Main", "Exception: " + e.toString());
}
return "Done";
}
此操作没有任何错误,并触发Google云端存储检测到的API调用。但是,它每次都返回错误200(作业被取消)。我不明白这是怎么回事,因为我没有在代码中做任何取消请求的事情,而且我也不知道如何将取消呼叫的异步任务取消。
这只是我复制的一个糟糕的示例应用程序和BigQuery客户端的错误用法吗?如果是这样,那么从Android发送数据到BigQuery的最佳方式是什么?