2016-09-23 101 views
0

我有一個軟件連接到一個Azure數據庫收集公式幾個品種的顏色,讓用戶按照配方來創建自己的產品。 基本上,應用程序啓動時只有一個大的數據庫拉,拉下所有的公式,並從那裏用戶可以簡單地使用,修改,甚至刪除公式,因爲他們希望。本地複製/緩存Azure數據庫以供離線使用。

的問題是,在使用該軟件,也有很少恆定的互聯網連接,應用至今設計簡單關機如果沒有一個存在。

我正在尋找一種解決方案,能夠允許應用程序在應用程序啓動時(如果存在連接)連接到數據庫並在本地保存副本,或者如果沒有連接存在,請檢查本地保存的副本與工作。

我已到處尋找,但一直無法找到任何方法以「編程方式」檢索相關(或所有必要的)數據,並將其導出到本地文件或以某種方式將其緩存以供離線使用。

有什麼建議嗎?

回答

1

你沒有提到你正在使用在客戶端什麼樣的技術,如果你需要訪問客戶端或者僅僅是數據上的數據庫 - 但無論有幾種方法可以做到這一點。

Azure移動應用程序有一個快速入門,它將實現Azure SQL < - > SQL Lite(移動)數據庫同步框架(服務器端的表控制器)。這使您可以使用移動端的庫來使用本地數據庫來獲取其數據,並且當您知道您處於聯機狀態時,您可以與服務器進行同步。這非常複雜,可能不僅僅是您正在尋找的緩存。

我已經用於緩存其他兩個策略 - 一個HTML/JavaScript的應用基礎(的PhoneGap /科爾多瓦),另一個用於在iOS和Android Xamarin C#應用程序。我假設如果它是一個標準的Windows桌面應用程序,你知道如何堅持數據,所以你可以使用任何類型的緩存/文件系統/ DB你喜歡。

的JavaScript/HTML - 使用HTML5 localStorage的功能是存儲該Web服務器的JSON輸出調用你正在做。這真的很容易,然後抽象,你的應用程序之前正在做一個Ajax調用服務器來獲取一些數據,而不是移動到一個「liveorcache」類,它可以決定是否去服務器或只使用本地存儲。下面localStorage的代碼片段保存/載入JSON:

$scope.saveFixtures = function() { 
    localStorage["fixtures"] = JSON.stringify($scope.fixtures); 
    }; 

    $scope.loadFixtures = function() { 
    if (localStorage["fixtures"] != undefined) { 
     $scope.fixtures = JSON.parse(localStorage["fixtures"]); 
    } 
    }; 

如果你在寫Xamarin您的應用程序,你可以做同樣的事情,但使用PCL庫 - 我用「PCLStorage」,這適用於Android和iOS。同樣的策略,在我的代碼中,我只是將JSON數據寫入具有合適文件名的文件中,但通常將該對象包裝在另一個包含緩存寫入日期/時間的對象中。然後,將對象序列化到文件中 - 如下所示。

public class CacheProvider 
{ 
public static async Task<CacheModel> ReadCache<T>(string filename) 
{ 
    IFolder rootFolder = FileSystem.Current.LocalStorage; 
    IFolder cache = await rootFolder.CreateFolderAsync("sportenzaCache", CreationCollisionOption.OpenIfExists); 
    try 
    { 
    IFile file = await cache.GetFileAsync(filename); 
    var data = await file.ReadAllTextAsync(); 
    return JsonConvert.DeserializeObject<T>(data) as CacheModel; 
    } 
    catch(FileNotFoundException ex) 
    { 
    return null; 
    } 
} 

public static async void WriteCache<T>(string filename, CacheModel data) 
{ 
    IFolder rootFolder = FileSystem.Current.LocalStorage; 
    IFolder cache = await rootFolder.CreateFolderAsync("sportenzaCache", CreationCollisionOption.OpenIfExists); 
    IFile file = await cache.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); 
    if (file != null) 
    { 
    data.CacheCreated = DateTime.Now; 
    string json = JsonConvert.SerializeObject(data); 
    await file.WriteAllTextAsync(json); 
    } 
} 

public static async void DeleteCache(string filename) 
{ 
    IFolder rootFolder = FileSystem.Current.LocalStorage; 
    IFolder cache = await rootFolder.CreateFolderAsync("sportenzaCache", CreationCollisionOption.OpenIfExists); 
    IFile file = await cache.GetFileAsync(filename); 
    if (file != null) 
    await file.DeleteAsync(); 
} 
} 
+0

我使用WPF使用Visual Basic。 我見過Azure數據同步的東西,但我擔心的是它圍繞着「移動」這個術語引發了很多,並提到了像iPhone,Windows Phone和Android這樣的平臺。 該功能是否可以與我的桌面應用程序一起運行? –

+1

嗨威廉 - 仍然不確定你想用什麼技術來實際存儲和訪問客戶端的數據。「移動應用程序」方法基本上是一個模板,它爲您提供了一個工作的起點,針對偶爾斷開連接的應用程序的人員 - 通常情況下,這是移動應用程序,但不一定是。客戶端代碼使用SQLLite,它也可以在桌面平臺上運行。但是,您可以選擇仍使用JSON序列化數據進行緩存,或者使用其他數據庫進行自己的實現,例如... –

+0

謝謝@Russel Young。 我絕對期待/希望用Sqlite來實現。我想我會繼續前進,並使用完全有效的Azure數據同步,而不是簡單地使用JSON緩存它(有點是因爲我幾乎沒有任何想法如何完成,找不到任何資源來學習,也不知道它的目的是什麼將盡可能節省系統資源) 如果我發現問題或使用其他實現的充分理由,我可能會決定從Azure數據同步中回滾並使用後一個建議。 –