0

Я пытаюсь воспроизвести сообщение «Начало работы с легкими таблицами Azure Mobile Apps» от James Montemagno. Однако я хотел бы внести некоторые изменения и/или дополнения, чтобы результат соответствовал моим личным интересам. Все работает отлично, за исключением одного вопроса:Xamarin Forms и Azure Mobile Apps: CancelledBySyncStoreError Исключение из PullAsync

PullAsync (от IMobileServiceSyncTable) бросает CancelledBySyncStoreError исключение !!!

(Я выполнив Xamarin Forms приложение как Android App - цель decice является Nexus 7 с Android версии 5.1.1)

Детали следующим образом:

В Azure Portal I» ve setup Easy Table. Схема выглядит следующим образом:

Azure Schema Definition of Easy Table

таблица на Портале, кажется, правильно установлена, потому что я могу интегрировать удаленную таблицу в Visual Studio (2013) Server Explorer. Детали схемы, как видно из 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) 
); 

Как вы можете видеть, я добавил три колонки на портале вручную: Название, Оценка и PlayedAt. Соответствующие типы данных SQL: String, Номер и Дата. Все остальные записи схемы были созданы автоматически дизайнером схемы Azure Portal.

Next некоторые информация о о моем Xamarin Forms App:

модель класса моего Azure Easy таблицы выглядит следующим образом (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); 
    } 
} 

The 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); 
    } 
} 

The SyncScores - и Initialize -метод имеют следующие переменные экземпляра:

private MobileServiceClient mobileService; 
private IMobileServiceSyncTable<FirstHighScores> scoresTable; 

Если я позвоню SyncScores (в пределах Read - или Написать -метод из моего Xamarin Forms Client), MobileServicePushFailedException -Exception с сообщением об ошибке 'CancelledBySyncStoreError' отбрасывается.

На мой взгляд, исключение, так как SQLite-клиент в Xamarin Forms приложения, которые проинструктированы о схеме таблицы через определение моего C# -класса «FirstHighScores» и удаленной схемы табличного соответствующей Azure Easy Table точно не соответствует.

Но я не могу понять разницу ....

К сожалению, некоторые идеи?

ответ

0

Я нашел обходное решение самостоятельно.

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

Когда дизайн модели базы данных был стабильным, я просто создал новый MobileServiceSQLiteStore объекта (средств: Я выбрал другой имени для хранения базы данных) ... и метода синхронизации работала отлично!

+0

Если вы удалите приложение с устройства, база данных будет удалена. –

Смежные вопросы