Android 使用用户缓存post系统 背景

Android 使用用户缓存post系统 背景,android,sqlite,caching,Android,Sqlite,Caching,想象一下像Twitter这样的帖子系统。你有帖子,每个帖子都有一个发布它的用户。我正试图做一些与此非常相似的事情,但我找不到正确的方法 主要问题是缓存所有内容,因为我不想每30秒下载一次所有帖子。为了解决这个问题,我只需从服务器和本地数据库分别获取最后一篇文章和最后一篇文章的日期,如果不同,就更新它问题在于:如果有人更改了用户本地数据库中已存在的某篇文章的文本,则不会更新该文章。让我们把这个问题称为#1 下一个问题(也是最有问题的)是用户。每个帖子都会显示发布它的用户的头像,因此我不能简单地缓存

想象一下像Twitter这样的帖子系统。你有帖子,每个帖子都有一个发布它的用户。我正试图做一些与此非常相似的事情,但我找不到正确的方法

主要问题是缓存所有内容,因为我不想每30秒下载一次所有帖子。为了解决这个问题,我只需从服务器和本地数据库分别获取最后一篇文章和最后一篇文章的日期,如果不同,就更新它问题在于:如果有人更改了用户本地数据库中已存在的某篇文章的文本,则不会更新该文章。让我们把这个问题称为#1

下一个问题(也是最有问题的)是用户。每个帖子都会显示发布它的用户的头像,因此我不能简单地缓存帖子,因为如果用户更改他的头像,缓存的版本将保留最后一个头像(由于问题1)。为了解决这个问题,我使用了一个通用的头像URL,但是如果帖子中有用户的名字呢?这是第二个问题

到目前为止我的解决方案 为了解决问题#1,我考虑在每篇文章中添加版本号,当有人编辑它时,版本号会增加。如果文章的版本号与数据库不同,则再次下载并更新文章内容。但是如果我有这么多的帖子,如果有多个用户在使用该服务,请求就会变得膨胀,服务器就会过载

为了解决问题2,我想到了与问题1类似的事情。我在每个用户配置文件上添加一个版本号。如果用户对其进行更新,则版本号会增加。加载帖子后,我向本地数据库发送一个请求以检索用户配置文件,然后它检查版本号,如果它与服务器匹配,则返回它,否则返回,更新并返回。这将是昂贵的,特别是如果用户只是更新他的名字,我重新下载的头像,但为此,我可以有两个独立的版本号

问题 处理此类问题的最佳方法是什么?这是一种最具可扩展性的解决方案,它不会使服务器过载,也不会在用户的smarthphone上下载大量不必要的内容

我用的是什么
我首先在Android上使用SQLite存储数据。我使用与服务器快速通信并接收请求。

您应该尝试使用推送通知来更新数据,而不是检查更新,让服务器在每次数据更改时通知您

这有助于澄清您的疑问:

GCM

您应该尝试使用推送通知来更新数据,而不是检查更新,让服务器在每次数据更改时通知您

这有助于澄清您的疑问:

GCM

我不知道我的建议是不是用火箭筒来杀死蚂蚁,但它是这样的:

似乎很适合你的解决方案。由于您需要在客户端缓存后端的所有内容,E.S.将允许您下载本地版本中更改的内容。客户端将类似于“嘿,服务器,给我从2016-03-27 19:52:28 UTC开始的所有用户更改”(您始终可以限制您需要的内容,例如“用户w/ID 1的更改”、“用户和帖子的更改”或“用户{1,2,3}和帖子{4,5,6}的更改”)

小例子:

GET/users事件?因为={timestamp}
(是的,我知道这不是最好的端点名称)

那么您的有效载荷将如下所示:

[
    {
        id: 1,
        name: "Foo",
        avatar: "http://example.com/foo.png",
        timestamp: 1234567890123
    },
    {
        id: 1,
        name: "Bar",
        timestamp: 124680246802
    },
    {
        id: 2,
        name: "Baz",
        timestamp: 124680246803
    }
]
如您所见,负载将返回的不是实体本身,而是自指定时间戳以来实体中的更改。你可以这样理解:

用户1在1234567890123处将其名称更改为“Foo”,并将其头像更改为“”

用户1在124680246802将其名称更改为“Bar”

用户2在124680246803将其名称更改为“Baz”

事件非常好,因为考虑到您的主要目标是提高缓存能力和减少带宽使用,您可以从后端数据库获取事件并生成一个新事件,该事件将所有更改合并在一个事件中(以最小化冗余)。如果我们将此应用于示例中,我们将以以下内容结束:

[
    {
        id: 1,
        name: "Bar",
        avatar: "http://example.com/foo.png",
        timestamp: 124680246802
    },
    {
        id: 2,
        name: "Baz",
        timestamp: 124680246803
    }
]
因为用户1将其名称更改为“Foo”并在更改后更改为“Bar”对客户端来说并不重要


当然,这意味着您的后端需要进行额外的更改,因为它需要将更改存储到您需要缓存的实体。

我不知道我建议的是用火箭筒杀死蚂蚁,但它是这样的:

似乎很适合你的解决方案。由于您需要在客户端缓存后端的所有内容,E.S.将允许您下载本地版本中更改的内容。客户端将类似于“嘿,服务器,给我从2016-03-27 19:52:28 UTC开始的所有用户更改”(您始终可以限制您需要的内容,例如“用户w/ID 1的更改”、“用户和帖子的更改”或“用户{1,2,3}和帖子{4,5,6}的更改”)

小例子:

GET/users事件?因为={timestamp}
(是的,我知道这不是最好的端点名称)

那么您的有效载荷将如下所示:

[
    {
        id: 1,
        name: "Foo",
        avatar: "http://example.com/foo.png",
        timestamp: 1234567890123
    },
    {
        id: 1,
        name: "Bar",
        timestamp: 124680246802
    },
    {
        id: 2,
        name: "Baz",
        timestamp: 124680246803
    }
]
如您所见,负载将返回的不是实体本身,而是自指定时间戳以来实体中的更改。你可以这样理解:

用户1在1234567890123处将其名称更改为“Foo”,并将其头像更改为“”

用户1在124680246802将其名称更改为“Bar”

用户2在124680246803将其名称更改为“Baz”

事件非常好,因为考虑到您的主要目标是提高缓存能力和减少带宽使用,您可以从后端数据库获取事件并生成一个新事件,该事件将所有更改合并在一个事件中(以最小化冗余)。如果我们将此应用于示例中,我们将以以下内容结束:

[
    {
        id: 1,
        name: "Bar",
        avatar: "http://example.com/foo.png",
        timestamp: 124680246802
    },
    {
        id: 2,
        name: "Baz",
        timestamp: 124680246803
    }
]
因为用户1将其名称更改为“Foo”并在更改后更改为“Bar”对客户端来说并不重要

当然,这意味着您的后端需要进行额外的更改,因为它需要