我有一个连接到Azure数据库的软件,用于收集多种颜色的公式,以允许用户按照配方创建自己的产品。 基本上,当应用程序启动时,只有一个大数据库拉,拉下所有公式,用户可以根据需要简单地使用,修改甚至删除公式。
问题在于,在使用此软件的情况下,很少有持续的互联网连接,到目前为止,应用程序只是设计为在没有存在的情况下关闭。
我正在寻找一种解决方案,允许应用程序在应用程序启动时连接到数据库(如果存在连接)并在本地保存副本,或者如果没有连接,请检查本地保存复制工作。
我到处寻找,但一直无法找到任何方法来编程"检索相关(或所有,如果需要)数据,并将其导出到本地文件,或以某种方式缓存它以供离线使用。
有什么建议吗?
答案 0 :(得分:1)
您没有提及您在客户端使用的技术类型,以及您是否需要访问客户端上的数据库或仅访问数据 - 但无论有多种方法可以执行此操作
Azure移动应用程序有一个快速入门,可以实现Azure SQL< - > SQL Lite(移动)数据库同步框架(服务器端的表控制器)。这使您可以使用移动端的库来使用本地数据库来获取其数据,当您知道自己在线时,可以与服务器同步。这非常复杂,可能不仅仅提供您正在寻找的缓存。
我已经使用了另外两种缓存策略 - 一种用于基于HTML / javascript的应用程序(phonegap / cordova),另一种用于iOS和Android上的Xamarin c#应用程序。我假设它是一个标准的Windows桌面应用程序,你知道如何保存数据,这样你就可以使用你喜欢的任何类型的缓存/文件系统/ db。
JavaScript / html - 使用html5 localStorage函数存储您正在制作的Web服务器调用的JSON输出。这非常容易抽象,之前您的应用程序正在对服务器进行ajax调用以获取一些数据,而不是将其移动到" liveorcache" class,可以确定是去服务器还是只使用本地存储。用于在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();
}
}