【问题标题】:How to access a sql database from a widget application如何从小部件应用程序访问 sql 数据库
【发布时间】:2012-04-22 05:21:01
【问题描述】:

因为有些cmets,简单来说问题:

小部件如何访问自己的 sqlite 数据库?

为什么它不适用于普通的 DatabaseAdapter 类?

是否需要某些权限?

Remotevie/AppWidgetProvider 是否有限制访问自己的数据库(没有 ContentProvider)


这个问题看起来很简单,但如果有人真的想知道我为什么要问,那么细节如下:

我有以下设置:

  1. 我有一个普通的 android 应用程序,它在 assets 文件夹中带有相当多的 HTML 页面。由于应用程序的大小,首选安装位置是外部 sd 卡。这很好用。

  2. 这意味着应用程序不能包含小部件,因为小部件需要驻留在内部 ROM 中。

  3. 相反,小部件将从外部 sd 卡上的应用程序数据库中读取。这是通过 ContentProvider/ContentProviderClient 实现的。

到目前为止一切正常。

现在,该小部件需要在每个实例的基础上维护一些持久的配置设置。因此,AppWidgetProvider 类不能使用首选项,因为它们会在每个类的基础上应用。

因此,为了保留(相当复杂的)特定于实例的配置数据,我希望 AppWidgetProvider 类拥有自己的小型 sqllite 数据库。

现在,虽然我可以通过 contentprovider 从小部件访问应用程序的数据库,但小部件似乎无法访问自己的数据库。我在小部件项目中有一个数据库适配器类;在 AppWidgetProvider 内部,我有 Context,但似乎没有写入。

对数据库适配器的调用正常(我已经完成了一些日志记录),但是当我检查表时,没有发生任何写入。

这是为什么呢?我真的需要小部件内的 ContentProvider 来访问小部件的数据库吗?我不想走那条路,因为当我实现从小部件访问应用程序数据库时,我必须通过 ContentProviderClient 而不是 ContentProvider。那会很麻烦。由于我需要的不仅仅是 CRUD 访问权限,因此显然需要创建一个自定义 ContentProviderClient。 android 文档明确指出“如果使用完全在您自己的应用程序中,您不需要提供程序来使用 SQLite 数据库。”所以恕我直言,这意味着小部件可以直接访问其数据库吗?我需要特殊权限吗?我怀疑,因为小部件在主屏幕进程中作为 RemoteViews 运行,所以对数据库的访问受到某种限制? 对此有何想法、想法、提示?

【问题讨论】:

  • 您真的希望人们阅读大量未格式化的文本,充满拼写错误,并花时间回答您吗?
  • 对你的问题做点什么,没人会看
  • @Ollie_C,这个问题并不全是错别字:英语对其作者来说是一门外语。我建议您遵循英语的悠久传统,并以同情的态度对待成年后学习英语的人。

标签: android database widget


【解决方案1】:

如果没有其他方法对您有用,我建议使用服务。为应用小部件提供服务是很常见的事情。

【讨论】:

  • 我实际上误解了 ContentProvider 的细节(毫不奇怪,文档有些不清楚)。解决办法是:有不同的URL,在查询方法里面,我根据URI切换不同的数据库查询。这样,4 种 CRUD 方法对于任何类型的查询总是足够的。我使用 MatrixCursor 来包装查询结果,这样无论我的实际查询返回什么,我都可以始终返回游标对象。
猜你喜欢
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2015-12-02
  • 2014-09-09
  • 2019-01-29
  • 2016-09-20
相关资源
最近更新 更多