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

在我的应用程序中,我有一个数据库,可以通过自定义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”,然后在另一个触摸“旧”,如果再次按下它应该移动到第一个值,“左”。

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

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

    它有效吗? 有没有其他方法可以解决我的问题?

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


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

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

    维护小部件状态/数据的唯一方法是永久存储所需的信息,而在Android中,这意味着写入文件,数据库或应用程序的SharedPreferences(最终也是文件)。 所以你有几个选项,但是看到你已经有了一个数据库/ ContentProvider的设置,那么简单地添加另一个列可能是有意义的,就像你提到的那样。 最终,它需要保存在某个地方,所以尽管一般情况下最好将文件/数据库读/写次数降到最低,但在这种情况下有必要这样做。 您可以在小部件上显示ProgressBar,直到查询完成,然后显示更新的信息,特别是如果您发现数据库查询需要很长时间才能执行。

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

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

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

    链接地址: http://www.djcxy.com/p/50657.html

    上一篇: Android widget, how to show the next value from the database on a touch event?

    下一篇: Android widget doesn't execute... sometimes