java - 使用实时数据使领域数据保持最新
问题描述
真的希望有人能够为我指出正确的方向。我们有一个应用程序,它使用 Realm 在设备上本地管理我们的数据。
通过一般使用,将有数据输入到设备,然后将尝试将其发送到我们在 API 上的实时服务。但是,由于用户所在的位置,在我们下次打开应用程序时重新下载数据之前,我们无法确定这是否已上传。
我们需要它在某种程度上像 Git 一样工作。如果不先提交更改,您将无法拉取。但我们没有承诺,而是在推动。
我们认为实时数据应该在这里优先,所以如果实时数据发生变化,它应该被拉下来,但是如果实时数据有空值但我们在本地有它,那么我们应该改变它。
有什么东西我们可以用来编写这个功能,不敢相信我们是第一个面对这个问题的人。或者是在用户开始工作之前我们应该如何获取数据的流程。
一个例子:
我们正在寻找保存用户输入的 imei 号码。这将当时保存到领域数据库并尝试更新实时数据库。如果在重新启动应用程序并且提取 imei 号码时这是不可能的,那么直到我们在本地拥有的实时丢失的数据被推送之前,我们才可能做到这一点。
Imei.java(领域模型)
public class Imei extends RealmObject {
@PrimaryKey
public int id;
public int deviceId;
public String imei;
}
当我们收到有关 fetch 的响应时:
@Override
public void onResponse(JSONObject response) {
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
ImeiResponse imeiResponse = gson.fromJson(response.toString(), ImeiResponse.class);
for (Imei imei : imeiResponse.imeis()) {
addToDB(imei);
}
}
然后我们使用 addToDb,我想在这里会进行某种检查,就好像我们能够拉取然后我们有足够好的连接来推送我们在本地拥有的数据
public void addToDB(Imei imei)
{
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
realm.copyToRealmOrUpdate(imei);
realm.commitTransaction();
}
解决方案
以防万一有人偶然发现这个问题,我们最终找到了解决方案。
每当我们需要保存数据时,我们都会将其添加到请求队列表中,然后尝试运行每个请求。如果通过,则将其删除,如果失败,则将其删除。
每次我们去拉数据时,我们首先检查请求队列并运行如果那里有任何东西,如果他们继续失败你就不要拉。
这对我们来说似乎是最好的解决方案。希望能帮助到你
推荐阅读
- asp.net-mvc-5 - 如何在 MVC 5 中将模型返回给 ajax 调用
- sql - 如何在 postgres 容器中运行 shell 脚本以确定数据库是否为空,如果不是则导入备份 SQL 脚本
- javascript - 如何在函数构造函数中使用标签
- google-apps-script - 在 Google Sheet 上创建公式
- scala - 如何在循环内为这些向量调用方法?
- spring - 'mvn clean install' 后找不到主类
- c - 按索引访问字符串与推进指针
- xcode - OpenCV:未授权捕获视频 OpenCV:相机未能正确初始化
- jquery - Selectize.js 创建:验证 CREATE 输入
- ios - 如何在swift中解析数组的json数组