0

我試圖從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不完全匹配。

但我無法弄清楚區別....

對不起,有些想法?

回答

0

我自己找到了解決方法。

也許在我的應用程序開發過程中,根據數據庫方案的一些細節可能已經改變(儘管我真的不記得這一點)。

當數據庫模型的設計是穩定的,我剛剛創建了一個新的MobileServiceSQLiteStore對象 (表示:我選擇另一個名稱爲數據庫存儲)...和同步方式工作得很好!

+0

如果您從設備上卸載應用程序,數據庫將被刪除。 –

相關問題