Android上的Azure MobileServicePushFailedException

我正尝试使用offline sync来构build应用程序,并遵循Azure上的教程

现在offline storage工作正常,但服务器上没有添加任何项目,但有以下例外情况:

  Error syncAsync com.microsoft.windowsazure.mobileservices.table.sync.push.MobileServicePushFailedException java.util.concurrent.ExecutionException: com.microsoft.windowsazure.mobileservices.table.sync.push.MobileServicePushFailedException at com.google.common.util.concurrent.AbstractFuture$Sync.getValue(AbstractFuture.java:299) at com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:286) at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116) at irisrecognition.example.com.irisrecognition.util.ItemManager$5.doInBackground(ItemManager.java:237) at irisrecognition.example.com.irisrecognition.util.ItemManager$5.doInBackground(ItemManager.java:232) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by: com.microsoft.windowsazure.mobileservices.table.sync.push.MobileServicePushFailedException at com.microsoft.windowsazure.mobileservices.table.sync.MobileServiceSyncContext.pushOperations(MobileServiceSyncContext.java:939) at com.microsoft.windowsazure.mobileservices.table.sync.MobileServiceSyncContext.consumePushSR(MobileServiceSyncContext.java:834) at com.microsoft.windowsazure.mobileservices.table.sync.MobileServiceSyncContext.access$1100(MobileServiceSyncContext.java:85) at com.microsoft.windowsazure.mobileservices.table.sync.MobileServiceSyncContext$PushSyncRequestConsumer.run(MobileServiceSyncContext.java:1127) 

这里是onCreate()的代码

  try { mClient = new MobileServiceClient( Constants.ROOT_URL, "kfogvaexzeDLYyPbRmBiHxQEBUYpku30", this).withFilter(new ProgressFilter()); initLocalStore().get(); syncAsync(); refreshItemsFromTable(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } 

还有一些…

 private AsyncTask<Void, Void, Void> initLocalStore() throws MobileServiceLocalStoreException, ExecutionException, InterruptedException { AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { try { mPullQuery = mClient.getTable(IrisEntry.class).where().orderBy("__createdAt", QueryOrder.Descending); MobileServiceSyncContext syncContext = mClient.getSyncContext(); SQLiteLocalStore localStore = new SQLiteLocalStore(mClient.getContext(), "OfflineStore", null, 1); SimpleSyncHandler handler = new SimpleSyncHandler(); Map<String, ColumnDataType> tableDefinition = new HashMap<String, ColumnDataType>(); tableDefinition.put("id", ColumnDataType.String); tableDefinition.put("text", ColumnDataType.String); tableDefinition.put("device", ColumnDataType.String); tableDefinition.put("segmentationAlgo", ColumnDataType.String); tableDefinition.put("imageUri", ColumnDataType.String); tableDefinition.put("containerName", ColumnDataType.String); tableDefinition.put("resourceName", ColumnDataType.String); tableDefinition.put("sasQueryString", ColumnDataType.String); tableDefinition.put("userId", ColumnDataType.String); tableDefinition.put("complete", ColumnDataType.Boolean); localStore.defineTable(Constants.TABLE_IRIS, tableDefinition); syncContext.initialize(localStore, handler).get(); mIrisTable = mClient.getSyncTable(IrisEntry.class); } catch (final Exception e) { e.printStackTrace(); } return null; } }; return runAsyncTask(task); } public void syncAsync() { if (isNetworkAvailable()) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { try { mClient.getSyncContext().push().get(); mIrisTable.pull(mPullQuery).get(); Log.e(LOGTAG, "Success syncAsync"); } catch (Exception e) { Log.e(LOGTAG, "Error syncAsync " + e.getMessage()); e.printStackTrace(); } return null; } }.execute(); } else { Log.e(LOGTAG, "You are not online, re-sync later!"); } } private boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } 

我的表的权限设置为允许使用Application Key 。 有任何想法吗?

编辑:

这显示在服务器上的日志文件中:

 ERROR { [Error: getaddrinfo ENOTFOUND] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo' } 

Solutions Collecting From Web of "Android上的Azure MobileServicePushFailedException"

我不确定这是否是答案,但是“Constants.ROOT_URL”是否包含像“ http://myurl.com ”这样的协议头string? ENOTFOUND错误意味着getaddrinfo调用的地址无法parsing。 你可能想尝试“myurl.com”,没有URI的协议部分。 另外该方法需要一个Uri类的参数。 它看起来像你可能会从MalformedURIException处理程序获取堆栈跟踪。 (即使你指定了其他的东西,这个调用也可能使用https)。

据我了解,问题是我的表被设置为Anonmyous Access 。 我将它们设置为Authenticated Only ,同步再次正常工作。 无论如何,我想要一些表没有身份validation访问(读所有用户),并检查我是否可以解决这个问题