Android widget,如何在触摸事件上显示数据库中的下一个值?

Android widget,如何在触摸事件上显示数据库中的下一个值?,android,android-widget,android-sqlite,Android,Android Widget,Android Sqlite,在我的应用程序中,我有一个数据库,我可以通过自定义ContentProvider访问该数据库,其中包含以下列: id\u widget=我要在其上显示值的小部件的appWidgetId id\u item=另一个表中某个值的id,我将通过SQL连接查询获得该值 name\u item=项目名称,由我通过创建的小部件配置活动分配 该表的一个示例如下: id_widget | id_item | name­_item ----------+---------+---------- 54

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

  • id\u widget=我要在其上显示值的小部件的appWidgetId
  • id\u item=另一个表中某个值的id,我将通过SQL连接查询获得该值
  • name\u 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连接查询从另一个表中获取的另一个值。这些值通过IntentService从站点解析,并保存在另一个表中)。触摸时,它应显示值“Available2”,然后再次触摸“old”,如果再次按下,它应移动到第一个值“left”

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

我已经找了两天另一个解决方案,但仍然没有找到任何东西。我唯一的想法是: -跟踪我显示的表的哪一行(可能通过向表中添加另一列) -每次我触摸小部件时,都会查询数据库中的下一行

它足够有效吗?还有别的办法解决我的问题吗

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

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

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

维护小部件状态/数据的唯一方法是持久存储所需信息,在Android中,这意味着写入文件、数据库或应用程序(最终也是文件)。因此,您有几个选项可以选择,但鉴于您已经设置了数据库/内容提供者,您可能需要简单地添加另一个列,如您所述。最终,它需要保存在某个地方,因此,尽管一般来说减少文件/数据库的读/写次数更好,但在这种情况下还是有必要这样做。您可以在小部件上显示一个,直到查询完成,然后显示更新的信息,特别是如果您发现数据库查询需要很长时间才能执行

为了完整起见。。。一些小部件使用后台来维护和/或更新小部件的状态。但就其本身而言,当设备关闭时,或者在服务因任何原因停止时,这显然不会保持小部件的状态/数据。我认为这对你的处境不太合适

综上所述,基于我对小部件的了解,我同意你建议的方法

这与您关于处理数据的问题没有直接关系,但我发现在开始时处理小部件点击非常有用