如何从小部件应用程序访问SQL数据库。

6
由于一些评论,简而言之问题是:
小部件如何访问自己的sqlite数据库?
为什么使用普通的DatabaseAdapter类无法工作?
是否需要特定的权限?
在没有ContentProvider的情况下,Remotevie/AppWidgetProvider访问自己的数据库是否有限制?
问题似乎很简单,但如果有人真的想知道我为什么会问这个问题,接下来会提供详细信息:
我有以下设置:
1.我有一个正常的Android应用程序,在资产文件夹中有相当多的HTML页面。由于应用程序的大小,首选安装位置是外部SD卡。这很好用。
2.这意味着应用程序不能包含小部件,因为小部件需要驻留在内部ROM中。
3.相反,小部件将从外部SD卡上的应用程序数据库中读取。这是通过ContentProvider/ContentProviderClient实现的。
到目前为止都很好用。
现在,该小部件需要保持一些持久的配置设置,以每个实例为基础。因此,AppWidgetProvider类不能使用首选项,因为它们将适用于每个类。
因此,为了保持(相当复杂的)实例特定配置数据,我希望AppWidgetProvider类拥有自己的小型sqllite数据库。
现在,虽然我可以通过contentprovider从小部件访问应用程序的数据库,但似乎小部件无法访问自己的数据库。我在小部件项目中有一个数据库适配器类;在AppWidgetProvider内部,我有上下文,但是似乎没有写入发生。
数据库适配器的调用已经通过了(我做了一些日志记录),但是当我检查表时,没有写入发生。
为什么会这样?我真的需要ContentProvider内部的小部件才能访问小部件的数据库吗?我不想走这条路,因为当我从小部件实现对应用程序数据库的访问时,我必须通过ContentProviderClient而不是ContentProvider。那将非常麻烦。因为我需要比CRUD更多的访问权限,所以显然需要创建一个自定义ContentProviderClient。Android文档明确指出:“如果使用完全在您自己的应用程序中,则不需要提供程序来使用SQLite数据库。”因此,在我看来,小部件可以直接访问其自己的数据库?我需要特殊权限吗?我怀疑,因为小部件作为RemoteViews在主屏幕进程中运行,所以对数据库的访问受到某种限制?
对此有什么想法、想法或提示吗?

3
你真的希望人们阅读那一大堆没有格式的、充满错别字的文本,并花时间回答你吗? - Ollie C
1
对你的问题进行一些处理,否则没有人会阅读它。 - njzk2
3
@Ollie_C,这个问题并没有很多拼写错误:英语对于提问者来说是一门外语。我建议你遵循英语语言的长久传统,以同情心来对待那些成年学习英语的人。 - boisvert
1个回答

1
我建议如果其他方法都不起作用,可以使用服务。对于应用程序小部件来说,使用服务是很常见的事情。

我其实对ContentProvider的细节有些误解(文档不太清晰也难怪)。解决方案是:使用不同的URL,在query方法内根据URI切换不同的数据库查询。这样,4个CRUD方法将始终足以满足任何类型的查询。我使用MatrixCursor来包装查询结果,这样我可以始终返回一个游标对象,无论我的实际查询返回什么。 - mrd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接