当更新数据库后只有少量数据更改时,通常如何在设备上重新加载/显示数据? (概念上)
Posted
技术标签:
【中文标题】当更新数据库后只有少量数据更改时,通常如何在设备上重新加载/显示数据? (概念上)【英文标题】:How is data typically reloaded/displayed on a device when only a tiny amount of data changes after updating the database? (Conceptually) 【发布时间】:2013-07-26 19:58:10 【问题描述】:以下是我所说的示例:
以 ios 版 Twitter 为例。每当您发布推文时,该推文都会发送到数据库,然后它也会作为推文列表的一部分显示在您的设备上。
仅发送一条推文后,您在设备上看到的推文列表如何更新?以下是我想到的一些可能的方法,但我要求的是哪一种是最好的方法:
发送推文后,从远程 Twitter 服务器重新下载最近推文的整个列表(我非常怀疑这一点,因为这将花费相对较长的时间,而实际上只是将一条推文附加到显示的推文数组) 保存推文对象的本地数组与数据库分开更新(例如,它更新数据库,然后用您发送到数据库的相同数据更新其数组,从不下载推文您刚刚发送,因为您不需要,因为您已经在本地拥有它,因为您编写了它) Core Data 是否能够在一个(或相对较少的)步骤中全部更新远程数据服务器和数组?(对不起,如果这是显而易见的答案,并且听起来我没有不去研究它,但我确实阅读了有关 Core Data 并开始了一个教程。只是内容太多,我需要一两天才能弄清楚它是否适合我的应用程序) 是否有其他管理方法?另外,如果它是上述后两个想法之一,您是否能够通过仅更新本地数组并从该数组重新加载单元格而不从数据库加载您的一条推文来更新表格视图单元格? 我只是好奇什么是最有效的方法。
因此,我的主要问题再次改写为:当您进行微小的单次更新(例如发送推文)而无需重新加载数据库中的所有数据(当有其他内容 [即其他推文] 时)已经加载。
(我知道除了 Twitter 开发人员之外没有人确切知道 Twitter 是如何完成的,但我只是以 Twitter 的这个功能为例。同样的概念可以应用于任何类似的应用程序。)
(另外,这是一个关于数据流的概念性问题,因此我不需要查看任何代码,但我们将不胜感激使用不同技术(如 Core Data)或仅更新数组的建议。)
(我一直在研究这个,以及所有不同的方法,它变得非常耗时,所以我想问问你们有经验的人。另外,这可以帮助有类似情况的其他人问题。)
(抱歉,我好像在问一堆问题,但我基本上是以不同的方式问同一个问题,并提供可能的解决方案。)
感谢任何见解!
【问题讨论】:
+1 表示努力分析问题。 【参考方案1】:像推文这样的不可变消息实际上很容易处理——服务器端和您的应用程序中。
当您从客户端向服务器发送推文时,您还会更新您的“主上下文”(请参阅“托管对象上下文”),这反过来会向您的控制器发送通知(请参阅NSFetchedResultsController
,这反过来会更新您的表格根据托管对象上下文中的本地模型查看。
从服务器更新只是将本地推文与同时添加的新推文合并。
既然没有可变的推文,同步真的没什么大不了的。正如评论中提到的,如果有可变推文(或任何类型的消息),同步将变得更加复杂。
Core Data 不会自动更新远程服务器。但是有一些解决方案可以通过 Core Data “查看”远程数据库 - 请参阅 NSIncrementalStore 和相关的第三方库 (AFIncrementalStore)。
【讨论】:
【参考方案2】:这是可笑的微不足道。您更新本地数据库并同时发送远程更新。
您使用远程响应将本地记录标记为已同步或稍后再次尝试更新。
【讨论】:
好吧,这只是“可笑的琐碎”,因为推文是不可变的。否则,它会变得异常复杂,甚至整个公司(我说的是苹果吗?)都难以做到正确。 @Couch 也许您正在考虑哲学问题,例如描述数据库的ACID 框架。但是,让所有推文确认最后一条是否到达的想法是可笑的。 不,没有 ACID - 但“最终一致”成为每个人可以随时编辑推文的一个因素 - 也就是说,当它们不是不可变的时。然后,同步变得复杂。以上是关于当更新数据库后只有少量数据更改时,通常如何在设备上重新加载/显示数据? (概念上)的主要内容,如果未能解决你的问题,请参考以下文章
当端点和 PMA 地址都更改时,CubeMX 生成的 USB HID 设备发送错误数据
列表数据更改时更新Android ListActivity?
当 iPhone 的 Appstore 上的应用程序版本更改时,sqlite 数据库更新