我的问题围绕着一个问题-移动应用程序中的数据管理。我创建了一个移动应用程序,其中数据来自服务器。数据包括文本和图像。以下是我为此采取的步骤:
首次发射: 1.获取服务器数据。 2.将服务器数据保存在Sqlite数据库中。 3.显示Sqlite数据。下一轮发射: 1.显示Sqlite数据。 2.后台获取服务器数据。 3.删除以前的Sqlite数据。 4.将新的服务器数据保存在Sqlite数据库中。 5.显示Sqlite数据。
关于这些步骤,我有几个问题:
Sqlite数据与新的服务器数据进行比较。但也面临着巨大的挑战。新服务器数据可能有新记录或已删除记录。此外,我无法找到一种适当的方法来比较每个数据库字段和JSON数据。
那么,比较本地Sqlite 数据和新服务器数据的最佳方法是什么?Sqlite数据并插入新数据,然后刷新屏幕(其中有一个UITableView),它就会闪烁一秒,这是显而易见的。如果遵循步骤3、4、5,如何避免此问题?NSOperationQueues,或者为此使用了GCD。但是,如果我疯了,一遍又一遍地来回看电影呢?队列中将有许多NSOperations。发布于 2015-10-07 10:46:30
同步服务器数据是一个挑战,我以前就这样做过,如果您能花时间在上面,我会说这是最好的解决方案。
您可能需要在服务器和本地对象上创建和修改日期,以比较它们--这将使您能够决定要添加、更新和删除哪些对象。如果服务器只向您发送最近更新的对象,则可以节省大量通信量并提高性能(但删除的对象将更难检测)。
如果数据只在服务器中更改,就会更容易,当应用程序也可以更改数据时,情况就会变得更加复杂(但似乎不是您的情况)。当然,这还取决于数据库的复杂程度。
如果你不想花时间去做这件事,每次只获取所有的数据也是有效的,即使它并不理想!而不是显示旧的数据和闪烁它,你可以让用户等待2-3秒时,当你进入,而你得到新的数据。或者,只有在启动应用程序时才能获取数据,所以当您到达该视图控制器时,它就已经准备好了。
这是每个人在某一时刻都面临的一个复杂问题,所以我很好奇其他人会提出什么建议:)
发布于 2015-10-16 10:52:52
这是个好问题。
我个人认为下载数据,在本地存储,然后尝试同步是一种危险的情况。容易引入错误,主<->从问题(什么数据应该是主,如果使用多个设备等)
我认为这可能是一种可行的方法:
1. -我将尝试研究从服务器按需加载数据的可能性。即当用户拥有一个应该显示数据的视图时,通过创建该特定视图加载该特定数据。这可以确保数据始终保持同步。
2.可以通过简单地将下载的数据存储在内存中(而不是使用SqlLite)来解决从服务器从每个视图重新加载数据的需要。视图将尝试通过缓存管理器加载所需的数据,如果可用,它将从内存中提供数据。如果不在内存中,只需从服务器获取数据并将其添加到内存缓存中即可。内存缓存可以是一个自制的数据管理器,用于包装存储在Dictionary上的AppDelegate,也可以是一些全局的"Singelton“来包装缓存管理/存储和数据加载。
3.使用延迟加载的数据和内存缓存的需要确保任何更新(更改、新记录、已删除的记录)都会更新内存数据模型,并尽快将这些更改推送到服务器。根据数据大小等,您可以强迫用户等待,或者将其直接作为后台进程执行。
4.为了确保数据同步,您应该确保定期使缓存中的本地内存记录失效(删除),从而强制从服务器更新数据。最好的方法可能是为内存缓存中的每个记录设置一个最后更新的时间戳。因此,定期无效器只会从内存缓存中删除“旧记录”(再次从服务器中删除)。
为了从不必要的数据负载中保存服务器,当用户在视图中需要数据时,数据仍然应该按需加载,而不是作为“缓存失效”的一部分。
5.取决于您可能需要查看的“缓存失效”的数据大小。可以像存储xx记录时一样简单,开始从内存缓存中删除旧对象(不是服务器,只在设备上本地删除)。
6.如果数据同步是绝对关键的,您可能希望在允许用户更改数据之前刷新内存缓存以获得记录。例如,当用户点击"Edit“或类似的内容时,您将从服务器获取该记录的最新数据。这只是为了确保用户不会使用过时的数据更新记录,从而意外地覆盖远程或其他设备上所做的任何更改。
--
我对它的看法。我不相信有一个“完美的正确方法”来这样做。但这就是我想要做的。
希望这将有助于一些想法和启示。

发布于 2015-10-10 23:27:07
这个怎么样:
如果在步骤1中没有找到任何数据,则在步骤2期间向用户显示一个“加载”屏幕。
我假设来自SqlLite的数据足够小,可以在内存中保存一个副本以显示在您的UITable视图中( UITable视图总是显示内存中的数据)。
如果数据足够小,可以同时在内存中保存两个副本(您将创建一个新的内存副本,并在完成后与可见副本交换),则可以将步骤4和步骤5结合起来。
注意:我这里不讨论错误处理,但是我建议您在有新的数据来替换之前,不要删除sqlite数据。
这种方法也不需要确定这是否是第一次发射。逻辑始终保持不变,这将使其更易于实现。
希望这是有用的。
https://stackoverflow.com/questions/32989753
复制相似问题