1

在我的应用程序中,我有一个数据库,我通过自定义ContentProvider访问该数据库,其中包含以下列:

  • id_widget = 我想显示值的小部件的 appWidgetId
  • id_item = 另一个表中的值的 id,我将通过 SQL JOIN 查询获得
  • name_item = 项目的名称,由我通过我创建的小部件配置活动分配。

该表的一个示例可能是这样的:

id_widget | id_item | name­_item
----------+---------+----------
    54    |    1    | avaible
    54    |    2    |  used
    58    |    1    |  left
    58    |    3    | avaible2
    58    |    5    |   old

我的小部件应该只显示存储的第一个值,但是当按下时,我希望它们显示下一个值,依此类推,直到最后一个值,然后它们应该再次移动到第一个值。因此,例如,appWidgetId = 58 的小部件应显示“left”(以及我将使用 SQL JOIN QUERY 从另一个表中获取的另一个值。这些值通过 IntentService 从站点解析,并保存在另一个桌子)。触摸时,它应该显示值“avaible2”,然后再次触摸“old”,如果再次按下它应该移动到第一个值“left”。

我的第一个想法是查询数据库以获取所有值,并将它们存储在 AppWidgetProvider 内的一些集合中,以便在 onUpdate 方法中使用它们。这样我就不必每次触摸小部件时都查询数据库。直到我阅读了 AppWidgetProvider 上的文档并了解了它的实际工作原理以及我并不总是拥有相同的实例这一事实。

我一直在寻找另一种解决方案两天,但我仍然没有找到任何东西。我得到的唯一想法如下: - 跟踪我正在显示的表格的哪一行(可能通过在表格中添加另一列) - 每次触摸小部件时查询数据库的下一行。

是否足够高效?还有其他方法可以解决我的问题吗?

我为我的英语道歉,但由于这不是我的母语,这是我能做的最好的。提前致谢

4

1 回答 1

0

首先,你的英语很棒!如果你没有提到它,甚至不会知道它不是你的母语。:)

正如您在问题中已经指出的那样,AppWidgetProvider是无状态的:您不能保证(事实上,不太可能)您将获得 AppWidgetProvider 类的相同实例。它们是一种特殊类型的BroadcastReceiver,它只在需要处理它正在侦听的事件时才存在。请特别参阅本节

维护小部件状态/数据的唯一方法是持久存储所需的信息,在 Android 中,这意味着写入文件、数据库或应用程序的SharedPreferences(最终也是文件)。因此,您有几个选项,但是鉴于您已经设置了数据库/内容提供程序,因此像您提到的那样,简单地添加另一列可能是有意义的。最终,它需要保存在某个地方,因此即使通常最好将文件/数据库读取/写入的次数降至最低,但在这种情况下还是有必要这样做。您可以在小部件上显示一个ProgressBar,直到查询完成,然后显示更新的信息,尤其是当您发现数据库查询需要很长时间才能执行时。

只是为了完整起见......一些小部件使用后台服务来维护和/或更新小部件的状态。但就其本身而言,这显然不会在设备关闭时保留小部件的状态/数据,或者在服务因任何原因停止的情况下。我认为这不适用于您的情况。

综上所述,根据我对小部件的了解,我同意您建议的方法!

这与您关于处理数据的问题没有直接关系,但我发现Commonsware 的这个示例应用程序在我开始时对处理小部件点击非常有帮助。

于 2013-09-27T14:09:19.963 回答