我試圖從James Montemagno重現「Azure移動應用程序的簡易表入門」文章。不過,我想進行一些更改和/或添加,以便結果符合我個人的興趣。一切工作正常,除了一個問題:Xamarin Forms和Azure移動應用程序:來自PullAsync的CancelledBySyncStoreError異常
PullAsync(從IMobileServiceSyncTable)拋出CancelledBySyncStoreError例外!
(我執行Xamarin窗體應用程序作爲Android應用 - 目標decice是一個的Nexus 7與Android版5.1.1)是
詳情如下:
在天青門戶I」已經安裝了一個簡易表。該架構如下:
Azure Schema Definition of Easy Table
門戶中的表似乎是正確建立,因爲我可以集成在Visual Studio(2013年)服務器資源管理器的遠程表。如從Visual Studio看出架構詳情如下:
Table Schema as seen by Visual Studio
或者:
CREATE TABLE [dbo].[FirstHighScores] (
[id] NVARCHAR (255) CONSTRAINT [DF_FirstHighScores_id] DEFAULT (CONVERT([nvarchar](255),newid(),(0))) NOT NULL,
[createdAt] DATETIMEOFFSET (3) CONSTRAINT [DF_FirstHighScores_createdAt] DEFAULT (CONVERT([datetimeoffset](3),sysutcdatetime(),(0))) NOT NULL,
[updatedAt] DATETIMEOFFSET (3) NULL,
[version] ROWVERSION NOT NULL,
[deleted] BIT DEFAULT ((0)) NULL,
[Name] NVARCHAR (MAX) NULL,
[Score] FLOAT (53) NULL,
[PlayedAt] DATETIMEOFFSET (3) NULL,
PRIMARY KEY NONCLUSTERED ([id] ASC)
);
正如你所看到的,我在手動門戶加入三列:名稱, 得分和玩過。 相應的SQL數據類型是字符串,號碼和日期。 所有其餘的模式條目已由Azure門戶方案設計器自動生成。
下一頁關於我Xamarin一些相關信息窗體應用程序:
模型類我Azure的簡易表如下所示 (Azure的表名和C#類的名稱是相同的()!):
namespace AzureHighScoresFirstApp
{
public class FirstHighScores
{
[Newtonsoft.Json.JsonProperty("Id")]
public string Id { get; set; }
[Microsoft.WindowsAzure.MobileServices.Version]
public string AzureVersion { get; set; }
public String Name { get; set; }
public DateTime PlayedAt { get; set; }
public float Score { get; set; }
}
}
以下初始化 -Method運行沒有(!)例外:
public async Task Initialize()
{
try
{
this.mobileService = new MobileServiceClient("http://peterstestapp.azurewebsites.net");
// setup local sqlite store and intialize our table
const string path = "syncstore.db";
MobileServiceSQLiteStore store = new MobileServiceSQLiteStore(path);
store.DefineTable<FirstHighScores>();
await this.mobileService.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler());
// get our sync table that will call out to azure
this.scoresTable = this.mobileService.GetSyncTable<FirstHighScores>();
Debug.WriteLine("Did Initialize");
}
catch(Exception ex)
{
Debug.WriteLine("{0}", ex.Message);
}
}
的SyncScores - 方法如下所示:
public async Task SyncScores()
{
try
{
IMobileServiceTableQuery<FirstHighScores> query = this.scoresTable.CreateQuery();
await this.scoresTable.PullAsync("allScores", query); <== **crashes**
await this.mobileService.SyncContext.PushAsync(); <== not reached
}
catch (MobileServicePushFailedException ex)
{
string ErrorString = string.Format("Push failed because of sync errors: {0} errors, message: {1}",
ex.PushResult.Errors.Count, ex.Message);
Debug.WriteLine(ErrorString + " - " + ex.PushResult.Status);
}
catch (Exception ex)
{
Debug.WriteLine("Exception SyncScores: " + ex);
}
}
的SyncScores - 和初始化 - 方法分享以下實例變量:
private MobileServiceClient mobileService;
private IMobileServiceSyncTable<FirstHighScores> scoresTable;
如果我打電話個SyncScores(一讀內 - 或寫從我Xamarin - 方法窗體客戶端),一個MobileServicePushFailedException -Exception並顯示錯誤消息 'CancelledBySyncStoreError' 被拋出。
在我看來異常被拋出,因爲SQLite的客戶端在Xamarin窗體應用程序,被指示有關通過我的C#-class「FirstHighScores」的定義表方案及相應的遠程表方案Azure Easy Table不完全匹配。
但我無法弄清楚區別....
對不起,有些想法?
如果您從設備上卸載應用程序,數據庫將被刪除。 –