通过 REST 进行客户端-服务器同步

2024-02-23

这个问题是关于我认为 Android / iOS 开发中非常常见的问题,但我还没有找到任何“标准”解决方案。

假设我们有一个相当普通的 REST API。服务器数据库包含(除其他外)表countries and towns具有 1:N 关系。

客户端(移动应用程序)想要维护这两个表的本地快照。这样,当它处于离线状态时,它可以执行通常通过 REST 完成的查询,例如:“获取人口 >= 100 的奥地利城镇列表”?

如何处理这个问题?

第一个问题:一致性。客户端应该有两个表的快照。如果客户端下载了更新towns表并离线,某些城镇可能会引用不在本地副本中的国家/地区countries table.

第二个问题:客户端应该只下载新的/删除的/更改的行。放弃 REST 并使用一些自定义 RPC 调用,例如get_updates_since(...)?

第三个问题:对客户端数据库副本的本地更改(可能是离线的)应如何与服务器同步?自定义 RPC 调用?


我不认为有什么灵丹妙药,但您正在寻找的模式是缓存。在过去的项目中,我将项目从服务器复制到本地存储(SQLite 或平面文件),并根据简单的规则维护有关要更新/上传/清除的条目的元数据。这不是一个简单的问题,最终会产生大量代码。

一致性:在您的示例中,要么确保首先下载国家/地区表,要么使这两个操作原子化 - 例如,制作“新”表的副本,并且仅在两个副本都成功完成时才替换缓存的版本(存储量加倍)。

仅下载新的/删除的/更改的:是的,这需要客户端/服务器集成 - 为所有记录添加时间戳(使用 GMT),从服务器请求元数据,并遍历本地元数据来决定要做什么。 (行上的提示 UUID 很有帮助)。

同步本地更改:是的,更多的客户端/服务器集成。参见上段。

处理所有异常和边缘情况具有挑战性。看看iCloud 同步 CoreData 的问题 http://www.theverge.com/2013/3/26/4148628/why-doesnt-icloud-just-work。也许这不是一个公平的比较,因为苹果正在尝试解决这个完全分布式数据库的问题,但尽管如此,读起来还是很有趣。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 REST 进行客户端-服务器同步 的相关文章

  • RecyclerView 在聊天屏幕中的 notificationDataSetChanged 上滚动到顶部

    我正在尝试使用 recyclerView 创建消息传递类型的屏幕 该屏幕将从底部开始 并在用户到达聊天顶端时加载更多数据 但我面临着这个奇怪的问题 我的 recyclerView 在调用 notificationDataSetChanged
  • TextView 宽度匹配drawableTop 宽度

    有什么办法可以使TextView width匹配复合可绘制宽度 XML 例如对于 xml 代码
  • 除非在后台线程中获取新的引用,否则存在潜在的引用计数问题

    我有一个second https stackoverflow com questions 28898966 prefer property accessor or kvc style for accessing core data prop
  • 在 Android 中跨单元测试和仪器测试共享资源

    现在谷歌已经添加了实验单元测试支持 http tools android com tech docs unit testing support 如何在单元测试和仪器测试之间共享资源 例如 假设我有一个TestUtils java我希望在单元
  • 警报对话框中的 Webview 不显示内容

    我正在开发一个 Android 应用程序 我需要在网络视图和警报对话框上显示一个网站 该站点显示在网络视图中 但不显示在警报对话框中 到目前为止 这是我的代码 WebView WebView myWebView WebView v find
  • 如何将 UIImageView 裁剪为自定义形状

    用户是否可以在该位周围画一条虚线 圆圈 UIImageView他们希望裁剪到 然后为UIImageView调整大小到这些点 这有点像 Photoshop 中的套索 选取框效果 更新 从 iOS 8 x 开始 UIImageView 提供了m
  • 你如何在react-native中实现捏合缩放?

    我一直在研究 PanResponder 我当前的工作假设是 我将检测是否有两个触摸正在向外移动 如果是 则增加元素大小onPanResponderMove功能 这似乎是一种混乱的方法 有没有更顺畅的方法呢 如果您只需要简单的捏缩放功能 只需
  • ShareKit + Facebook 身份验证不起作用

    我正在使用 ShareKit 从我正在开发的 PhoneGap 应用程序发布到 Facebook 我在 Facebook 中创建了该应用程序 并在我的项目中安装了该插件 Twitter 工作正常 但当我尝试在 Facebook 上分享时出现
  • Android:canvas.drawBitmap() 方法无法正常工作

    我已经发布了两个与此相关的问题 请参考此自定义饼图 1 https stackoverflow com questions 28343600 customize pie chart in quarter shape at the botto
  • iOS 设置 MKMapView 中心,因此提供的位置位于底部中心

    我有一个 MKMapView 和一个永不改变的 CLLocationCooperative2D 我想做的是将地图居中 以便该坐标将放置在地图的底部中心 我可以用简单的方法将地图集中在这个坐标上 MKCoordinateRegion view
  • UICollectionReusableView 方法未被调用

    我希望我的部分位于UICollectionView有一个带有图像的标题 我已按照以下步骤操作 在故事板中 分配了一个标题作为我的附件UICollectionView 给它一个标识符 创建了一个子类UICollectionReusableVi
  • NSDateFormatter:根据 currentLocale 的日期,不包含年份

    这不会太难吧 我想显示不带年份的日期 例如 8 月 2 日 美国 或 02 08 德国 它也必须适用于许多其他语言环境 到目前为止 我唯一的想法是对年份进行正常格式 然后从生成的字符串中删除年份部分 我认为你需要看一下 NSString d
  • iOS NSURLSession,如何在didCompleteWithError中重试

    我想在我的服务器上尝试一次调用 直到成功为止 我想每 30 秒尝试一次 所以我使用 NSURLSession 进行通话 NSURLSessionDownloadTask task self session downloadTaskWithR
  • 如何获取 UITableView 中的所有单元格

    假设我有一个包含多行的 UITableView 我想在某个时间点将所有 UITableViewCells 作为 NSArray 获取 我努力了 tableView visibleCells 但这种方法有一个问题 我无法拥有当前不在当前屏幕中
  • 为什么 Google 建议将库复制到您的树中?

    谷歌的Play 服务 API 的使用说明 http developer android com google play services setup html 例如 说 将 extras google google play service
  • 如何从 Firebase 同步检索数据?

    我有两个集合 即用户和问题 根据使用 userId 登录的用户 我检索currQuestion价值来自users收藏 基于currQuestion值 我需要检索question来自 Firebase 的文档Questions收藏 我使用下面
  • 找不到数据库路径是不可能的

    我对 android 开发很陌生 现在我正在尝试通过扩展 SQLiteOpenHelper 的类创建数据库 我确信数据存储在我的 Nexus 7 我用来测试应用程序的设备 上的某个位置 但是我找不到数据库的路径 我四处寻找其他类似的问题 所
  • Xcode 在代码签名身份中看不到我的开发人员证书

    我续订了 IOS 开发人员证书 从钥匙串中删除了旧证书 然后单击了我的证书 钥匙串中的一切看起来都很正常 我有分发 开发人员 WWDC 证书 每个配置文件看起来都有效 并带有绿色标记 在组织器中的团队和配置文件部分下 但在代码签名身份下的
  • 如何解决 greenDAO 在执行 InsertOrReplace 时“不存在这样的表错误”?

    我正在使用 greenDAO 并且已成功生成所有必需的类和实体 并且我可以看到我的表已创建 但是在要替换的行上放置断点后 我收到一条错误消息 告诉我 不存在这样的表错误 try appTimeUsageDao insertOrReplace
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v

随机推荐

  • React Native热重载刷新但不更新更改

    我了解 React 的基础知识 并在 React 上完成了一些个人项目 现在我开始反应本机 https facebook github io react native 所以我创建了一个新项目并运行run android命令 它完成了所有必需
  • 隐藏 UITabBarController 中的顶部栏

    如何使用 OBJ C 代码 不使用 Interface Builder 隐藏 UITabBarController 中的顶部栏 请参阅下面链接中的图片以更好地了解我的要求 http skitch com jugsvn dxkr7 iphon
  • 如何对 MIME 消息中 Content-Disposition 标头的文件名参数值进行编码?

    通过查看一些邮件的来源 我发现很多邮件都使用了 Encoded Words RFC 2047 https www ietf org rfc rfc2047 txt 格式对文件名参数值进行编码 然而 根据 RFC 2047 这种编码方法不应用
  • Facebook SDK 是否使用 IDFA 进行移动应用程序安装?

    当您集成 Facebook SDK 来跟踪移动应用程序安装时 这是否使用 IDFA 因此您是否必须回答yes提交应用程序供审核时 iTunes Connect 问题中的相应问题 这是代码中的application didFinishLaun
  • 组件宽度属性发生意外变化

    我注意到运行下面列出的程序有时会产生不需要的效果 编辑 我简化了代码以使事情看起来更清晰 我正在绘制一个字符串 它打印出当前组件的大小 我重写了 Component 类中的 getPrefferedSize 方法 并将宽度和高度分别设置为
  • Clojure 打印函数:pr 与 print

    有什么区别pr prn and print println 什么时候会使用其中一个而不是另一个 它们在以下方面有所不同 print println生产供人类消费的产出 pr prn产生读者可以阅读的输出 因此 在为人类生成输出时使用前一个函
  • Mailgun:使用解析云代码发送图像

    我有一个代码定义为 Parse Cloud define mailgunSendMail function request response var Mailgun require mailgun Mailgun initialize ph
  • 如何重定向到 root - public/index.html?

    我希望重定向到我的 application public 文件夹中的index html def get current user current user current user if current user nil redirect
  • jQuery animate() 和浏览器性能

    我有一些元素在页面上移动得非常缓慢 本质上 我在 40 秒左右的时间内减少了两个图像的左边距 从视觉上看 它的工作效果非常好 然而 在动画播放过程中 我的处理器使用率跃升至 50 左右 这也不特定于任何单一浏览器 Safari3 和 Fir
  • 如何在可编码结构中使用计算属性(swift)

    我创建了一个 可编码 结构来序列化数据集并将其编码为 Json 除了计算属性未显示在 json 字符串中之外 一切都运行良好 如何在编码阶段包含计算属性 Ex struct SolidObject Codable var height Do
  • 使用 Logback 但 Log4j 开始显示 WARN no Appenders

    我正在使用 logback 进行日志记录 但它一直在工作 前几天我开始收到警告 log4j WARN 找不到记录器 org apache axis i18n ProjectResourceBundle 的附加程序 log4j WARN 请正
  • 在 Flutter 中制作固定的应用程序范围菜单,而不是平板电脑上的抽屉

    我的应用程序有很多路线 几乎每条路线都使用带有相同抽屉菜单的 Scaffold 在应用程序内部导航 我自己的 CustomDrawer 小部件 对于大屏幕的设备 我希望始终在布局中显示左侧的菜单 而不是使用抽屉 它在Gmail应用程序中的工
  • 使用 Erlang,我应该如何在集群之间分配负载?

    我正在查看从属 池模块 它看起来与我的类似 想要 但似乎我的系统中存在单点故障 应用程序 如果主节点出现故障 客户端有一个网关列表 为了后备 全部都做 相同的东西 接受连接 并且从其中选择一个 由客户随机 当客户端连接所有节点时 检查哪个负
  • 在 Windows 上优雅地终止子 Python 进程,以便 Final 子句运行

    在 Windows 机器上 我有许多父进程将启动子进程的场景 由于各种原因 父进程可能想要中止子进程但是 这很重要 让它清理 即运行finally子句 try res bookResource doStuff res finally cle
  • 在 Erlang 中使用 mochijson2 解码 JSON

    我有一个包含一些 JSON 数据的 var A lt lt job id 1 gt gt 使用 mochijson2 我解码数据 Struct mochijson2 decode A 现在我有这个 struct lt lt job gt g
  • 使用 lambda 函数在 pandas group 中聚合

    我有一个聚合声明如下 data data groupby type status name agg one np mean two lambda value 100 value gt 32 sum reading mean test2 la
  • 如何将多个正则表达式组合成一行?

    我的脚本可以很好地执行此操作 images re findall src S media tumblr S tumblr S jpg doc videos re findall S http S video file S tumblr a
  • JavaScript 中的条形码扫描仪?或者插件/扩展

    我正在考虑将 USB 条形码扫描仪接口写入 Web 应用程序 离线应用程序 我的意思是扫描仪将位于客户端计算机而不是服务器上 所以我想知道最好的设计是什么 我知道我可以将 ActiveX 对象或本机插件写入某些浏览器 但这并不理想 有谁知道
  • 如何自动运行 ulimit -c unlimited

    我正在尝试从我的rootfs提供对coredump文件生成的支持 我已经使用 ulimit c unlimited 命令和 hard core 1 修改了 etc limits文件 现在当我给出kill 6 时 期望生成核心文件 但要获取此
  • 通过 REST 进行客户端-服务器同步

    这个问题是关于我认为 Android iOS 开发中非常常见的问题 但我还没有找到任何 标准 解决方案 假设我们有一个相当普通的 REST API 服务器数据库包含 除其他外 表countries and towns具有 1 N 关系 客户