2017-08-30 39 views
0

我正嘗試使用Azure移動應用程序實現脫機數據庫同步。當我使用遠程版本(使用MobileServiceClient.GetTable而不是MobileService.GetSyncTable)時,一切都可以成功。但是,我無法使它與本地SQLite數據庫一起工作。與Azure移動應用脫機同步無法正常工作,數據庫看起來爲空

DatabaseContext class在Autofac容器中註冊爲單例。

public class DatabaseContext 
{ 
    private readonly MobileServiceClient _client; 
    private readonly MobileServiceSQLiteStore _store; 

    public DatabaseContext() 
    { 
     if (File.Exists(Constants.LocalDatabase)) 
     { 
      File.Delete(Constants.LocalDatabase); 
     } 

     _client = new MobileServiceClient(Constants.ApiEndpoint); 
     _store = new MobileServiceSQLiteStore(Constants.LocalDatabaseName); 
    } 

    public async Task Initialize() 
    { 
     _store.DefineTable<Activities>(); 

     await _client.SyncContext.InitializeAsync(_store); 
     await _client.SyncContext.PushAsync(); 

     var activitiesTable = _client.GetSyncTable<Activities>(); 
     await activitiesTable.PullAsync(null, activitiesTable.CreateQuery()); 


     // DATA IS EMPTY 
     var data = await activitiesTable.CreateQuery().ToListAsync(); 
    } 
} 

我的模型類:

public class Activities 
{ 
    public Guid Id { get; set; } 
    public string Name{ get; set; } 
    public DateTimeOffset? UpdatedAt { get; set; } 
    public DateTimeOffset? CreatedAt { get; set; } 
    public byte[] Version { get; set; } 
} 

當我看着蔚藍的儀表盤在我的流日誌,我可以看到這個請求:

GET /tables/Activities $skip=0&$top=50&__includeDeleted=true&$skip=0&$top=50&__includeDeleted=true&X-ARR-LOG-ID=19cd669b-df9a-41ee-b86e-9db766fc8e01 443 - 70.52.250.32 ZUMO/4.0+(lang=Managed;+os=Android;+os_version=6.0.1;+arch=Unix;+version=4.0.0.0) - 200 0 0 3228 1241 2160 

與郵差調用返回的數據。

有什麼想法?

回答

0

問題來自API方面。我能夠使用郵遞員檢索記錄,但是,ID字段不是小寫字母。

[Key] 
[TableColumn(TableColumnType.Id)] 
public string Id { get; set; } 

應該是:

[Key] 
[TableColumn(TableColumnType.Id)] 
public string id { get; set; } 

非常令人沮喪的錯誤。

鑑於本教程:https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter3/server/,由於「Id」字段爲駱駝大小寫,此類無法正常工作。

namespace Chapter3.DataObjects 
{ 
    public class Example : EntityData 
    { 
     public string StringField { get; set; } 
     public int IntField { get; set; } 
     public double DoubleField { get; set; } 
     public DateTimeOffset DateTimeField { get; set; } 
    } 
} 

EntityData類將工作使用遠程表(MobileClientService.GetTable<T>),但與同步表(MobileClientService.GetSyncTable<T>)。

1

雖然你的Activities模型可以工作,我會這樣定義我的模型:

public class Activities 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    [UpdatedAt] 
    public DateTimeOffset? UpdatedAt { get; set; } 
    [CreatedAt] 
    public DateTimeOffset? CreatedAt { get; set; } 
    [Version] 
    public byte[] Version { get; set; } 
} 

注:createdAtupdatedAtversion字段由數據庫更新,如果你把結果到服務器,它們將被填充。

我在我身邊進行了測試,發現我可以從服務器上獲取記錄,並且在sqlite數據庫中有記錄。

await activitiesTable.PullAsync(null,activitiesTable.CreateQuery());

上面的代碼會自動發送多個請求(默認頁面大小50單個請求)拉的所有記錄,那麼它會執行下面的SQL語句來更新您的本地數據存儲:

BEGIN TRANSACTION

INSERT OR IGNORE INTO [TodoItem]([id])VALUES(@ p0),(@ p1),(@ p2),(@ p3),(@ p4),(@ p5),(@ P6),(@ P7),(@ P8),(@ P9),(@ P10),(@ P11),(@ P12),(@ P13),(@ P14),(@ P15),(@ P16),(@ P17),(@ P18),(@ P19),(@ P20),(@ P21),(@ P22),(@ P23),(@ P24),(@ P25),(@ P26),(@ P27),(@ P28),(@ P29),(@ P30),(@ P31),(@ P32),(@ P33),(@ P34),(@ P35),(@ P36 ),(@ P37),(@ P38),(@ P39),(@ P40),(@ P41),(@ P42),(@ P43),(@ P44),(@ P45),(@ P46 ),(@ P47),(@ P48),(@ P49)

UPDATE [的TodoItem] SET [文字] = @ P0,[用戶Id] = @ P1 WHERE [ID] = @ P2

UPDATE [TodoItem] SET [Text] = @ p0,[UserId] = @ p1 WHERE [id] = @ p2

COMMIT TRANSACTION

BEGIN TRANSACTION

INSERT或忽略INTO [__config]([ID])VALUES(@ P0)

UPDATE [__config] SET [值] = @ P0 WHERE [ ID = @ P1

COMMIT TRANSACTION

有關詳細信息,你可以參考Debugging the Offline Cache

根據您的描述,您可以從服務器檢索數據,但無法更新您的本地sqlite數據庫。我建議你在調用PullAsync時可以利用fiddler來捕獲網絡跟蹤,並打開你的sqlite數據庫來檢查你的表。

此外,由於如前所述Using soft delete in Mobile Services如下:

當使用Offline data Sync for Mobile Services功能,客戶端SDK會自動查詢已刪除的記錄,並從本地數據庫刪除它們。如果未啓用軟刪除,則需要在後端編寫其他代碼,以便客戶端SDK知道要從本地存儲中刪除哪些記錄。否則,客戶端本地存儲和後端將與這些已刪除的記錄不一致,並且必須調用客戶端方法PurgeAsync()來清除本地存儲。

注:您需要從記錄檢查deleted屬性時,您的呼叫PullAsync

此外,您可以利用移動應用程序下的「DEPLOYMENT> Quickstart」下載並運行Xamarin.Forms解決方案來縮小此問題。有關更多詳細信息,請參閱here。此外,你可以參考阿德里安大廳關於Chapter 3 - Data Access and Offline Sync的書。

+0

偉大的內容,但是,我的問題是沒有關係。感謝您的幫助! –

相關問題