如何确保多个模型对象实例之间的一致性

时间:2016-10-09 19:39:46

标签: java android sql model android-sqlite

背景

这是我在开发Android应用程序时不断回头的问题。假设我的应用让用户“关注”电视节目。我的TVShow模型类如下:

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

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

示例

假设我的数据库中有电视节目“The Walking Dead”,我从SQL查询中创建了一个TVShow对象。此对象实例将被称为TVShow#1。我决定“关注”这个节目,所以我设置TVShow#1.following = true。在我的应用程序的其他地方,我查询当前正在播出的节目列表,其中“行尸走肉”是其中的一部分。将为该列表创建一个名为TVShow的新TVShow#2实例。这里的问题是我有两个TVShow个对象,TVShow#1TVShow#2代表“行尸走肉”,但它们对following有不同的值。这会在我的应用程序逻辑中引起问题,因为代表同一电视节目的所有TVShow实例之间没有一致性。

MY BAD WORKAROUND

将此扩展为一堆对象实例和更复杂的字段和逻辑,这就是我目前所处的情况。我通过将所有SQL数据加载到内存中来缓解这种情况(通常是ArrayList或{{ 1}})启动应用程序时,只查询这些Java对象而不是SQL数据库。这种解决方案效率低且不方便,SQL查询可以提供帮助。我希望我的例子不会太混乱。如果我能澄清或提供更多信息,我会很高兴。如果我能做些更好的事情来确保同一模型对象的多个实例之间的一致性,请告诉我。

2 个答案:

答案 0 :(得分:0)

这听起来像"跟随"财产应该是用户的财产而不是电视节目。

您的数据库应记录用户之间的关联以及他们关注的显示。因此,如果用户决定关注节目,则在该用户与该节目之间保存数据库中的持久关联,然后在下次查询数据库时状态将保持一致。

答案 1 :(得分:0)

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

您的想法是“订阅”数据库查询中的数据。每次写入数据库时​​都会影响查询触及的某个表,然后重新运行查询并获得一组新数据。

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

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

StorIO
sqlbrite

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

最后你可以自己动手。这将涉及一个单一的注册查询的单例,链接到他们正在读取的表。每次执行写操作时,都要让本课程知道哪些表已更改,并重新运行查询。