背景

在开发Android应用程序时,我会反复提到这个问题。假设我的应用允许用户“关注”电视节目。我的TVShow模型类如下:

public class TVShow {
    String title;
    String[] show_cast;
    boolean currently_airing = true;
    boolean following = false;
    long nextEpisodeTime;
    String genre;
}


我有一个存储数百个电视节目的SQL数据库。这很有用,因为我可以利用详细的查询来基于特定信息选择节目。我遇到的问题是当我有多个TVShow实例代表同一场演出时。



假设我的数据库中有电视节目“行尸走肉”,并且通过SQL查询创建了TVShow对象。该对象实例将称为TVShow#1。我决定“关注”此节目,因此设置了TVShow#1.following = true。在我的应用中的其他位置,我查询了当前正在播放的节目列表,其中包括“行尸走肉”。将为该列表创建一个名为TVShowTVShow#2新实例。这里的问题是我有两个TVShow对象TVShow#1TVShow#2代表“行尸走肉”,但是它们对following的值不同。这将在我的应用程序的整个逻辑中引起问题,因为代表同一电视节目的所有TVShow实例之间都不一致。

我的坏解决方法

将其扩展为一堆对象实例以及更复杂的字段和逻辑,这就是我目前所处的情况。我通过在应用程序加载所有SQL数据到内存(通常为ArrayListHashMap)中来缓解这种情况启动,并且仅查询这些Java对象而不是SQL数据库。该解决方案效率低下且不方便,SQL查询确实可以提供帮助。我希望我的例子不要太混乱。如果我可以澄清或提供更多信息,我将很高兴。请让我知道是否有更好的方法可以确保同一模型对象的多个实例之间的一致性。

最佳答案

我用于此问题的解决方案是基于RxJava的,但是没有Rx也可以实现。

这个想法是您“订阅”数据库查询中的数据。每次对数据库的写入都会影响查询所涉及的表之一,然后重新运行查询,您将获得一组新的数据。

这样,当TVShow1保存到数据库时,生成TVShow2的查询将重新运行,并且您具有最新版本的数据。

如果您使用的是Rx,有两个库可以为您完成所有这些工作:

StorIO
sqlbrite

如果您不使用Rx,则Realm的更改适配器具有类似的功能。

最终,您可以自己滚动。这将涉及到一个单例,您可以在其中注册您的查询,并将其链接到正在读取的表。每次执行写操作时,您都应让此类知道哪些表已更改,并重新运行查询。

10-04 18:37