通过nativescript应用程序和数据库同步脱机

时间:2019-05-09 02:07:50

标签: sqlite nativescript nativescript-angular

我有一个NativeScript(角度)应用程序,该应用程序当前正在对服务器进行API调用以获取数据。

我想实现一种在设备联机后使用我当前的API进行双向同步的功能。没有BaaS。

我想到的第一个解决方案是进行某种缓存。有时,该应用会使数据库中的信息无效并再次获取。我不喜欢这种方法,因为有很大的列表(可能会更改。它们是成批获取的,即按页面获取。其中一个是下载并存储在设备上的文件列表。因此,我必须保留这些列表仍然在列表中,然后删除那些不在列表中。听起来像一场噩梦。

您将如何解决此类问题?

2 个答案:

答案 0 :(得分:2)

我使用nativescript-couchebase插件存储数据。我们提供以下服务

  1. 连接性
  2. 数据
  3. API服务

基于在线/离线的连通性,我们可以从远程API或通过benchebase db获取数据。请注意,API服务始终仅从Couchebase返回数据。

所以在在线模式下

API调用->写入数据库->从Couchebase返回最新数据

离线模式

读取数据库->从Couchebase返回最新数据

与此同时,我们将所有API调用都保留在队列中。因此,只要连接恢复,API调用就会被顺序处理。从脱机模式进入在线模式时,您可能面临的另一个挑战是令牌到期。上线后向用户显示一个小的弹出窗口可以解决此问题。

答案 1 :(得分:0)

我通过将数据另存为json字符串并将其保存到设备文件系统中来做到这一点。

加载/重新加载应用程序时,我会从文件中读取该文件。

即。    const fileSystemModule = require(“ tns-core-modules / file-system”);

var siteid = appSettings.getNumber("siteid");
var fileName =  viewName + ".json";
const documents = fileSystemModule.knownFolders.documents();
const site_folder = documents.getFolder("site");
const siteid_folder = site_folder.getFolder(siteid.toString());

const directoryPath = fileSystemModule.path.join(siteid_folder.path, fileName);
const directoryFile = fileSystemModule.File.fromPath(directoryPath);
directoryFile.writeText(json_string)
.then((result) => {
    directoryFile.readText().then((res) => {
        retFun(res);
    });
}).catch((err) => {
    console.log(err.stack);
});