使用Breezejs和MVC Web API存储和同步本地数据

时间:2014-11-27 14:39:04

标签: asp.net-mvc-4 local-storage breeze asp.net-web-api

我想使用breezejs api将数据存储在本地存储(indexdb或websql)中,并且还希望将本地数据与sql server同步。

但我无法实现这一目标,也无法使用breezejs,knockout和mvc api找到此类应用程序的示例应用程序。

我的要求是:

1)如果互联网可用,数据将来自sql server,使用mvc web api。

2)如果互联网关闭,应用程序将从缓存的本地存储(indexdb或websql)中检索数据。

3)一旦上网,本地数据就会同步到sql server。

请让我知道我是否可以使用breezejs api来实现此要求?

如果是,请提供一些链接和样本。

如果不是,我们还可以用什么来达到这种要求?

感谢。

请帮我满足这个要求。

1 个答案:

答案 0 :(得分:2)

你可以这样做,但我建议只使用localstorage。基本上,每次从服务器读取或保存到服务器时,都会导出实体并将其保存到本地存储。然而,当您需要读入数据时,如果服务器无法访问,您可以从localstorage读取数据并使用importentities将其导入管理器,然后在本地查询。

function getData() {
    var query = breeze.EntityQuery
               .from("{YourAPI}");

    manager.executeQuery.then(saveLocallyAndReturnPromise)
        .fail(tryLocalRestoreAndReturnPromise)

    // If query was successful remotely, then save the data in case connection 
    // is lost
    function saveLocallyAndReturnPromise(data) {
        // Should add error handling here.  This code
        // assumes tis local processing will be successful.
        var cacheData = manager.exportEntities()
        window.localStorage.setItem('savedCache',cacheData);

        // return queried data as a promise so that this detour is
        // transparent to viewmodel
        return Q(data);
    }
    function tryLocalRestoreAndReturnPromise(error) {
        // Assume any error just means the server is inaccessible.
        // Simplified for example, but more robust error handling is
        // warranted
        var cacheData = window.localStorage.getItem('savedCache');
        // NOTE: should handle empty saved cache here by throwing error;
        manager.importEntities(cacheData); // restore saved cache
        var query = query.using(breeze.FetchStrategy.FromLocalCache);
        return manager.executeQuery(query); // this is a promise
    }
}

这是一个简单的代码框架。您应该检查catch和处理错误,添加isConnected函数以确定连接性等。

如果你在本地进行编辑,还有一些可以跳过的箍。每次更改缓存时,都需要导出整个缓存或更改(可能取决于缓存的大小)。当存在连接时,您将需要首先测试本地更改,如果找到,则在重新检查服务器之前将它们保存到服务器。此外,在离线复杂化时所做的任何架构更改都非常重要,因此请注意这一点。

希望这会有所帮助。一个强大的实现有点复杂,但这应该给你一个起点。