ContentProvider:managedQuery()有效; query()失败

时间:2011-04-15 15:56:03

标签: android database sqlite android-contentprovider

在我的应用程序中,我正在将数据库访问包装到ContentProvider中。这是因为我偶尔崩溃,因为两个线程同时访问数据库。我非常依赖后台线程来从Web服务器下载数据并将其放入数据库中;当用户在活动之间切换时,您可能会同时运行多个活动。这就是原因。

现在怎么样。 我已经实现了ContentProvider类,这似乎工作正常。在清单中注册,这也在LogCat中显示提供者处于活动状态。

应用程序及其所有活动通过包装类访问数据库,包装类本身不是活动。此类的构造函数将调用活动的上下文作为参数。没什么特别的。

现在我的问题: 通过context.query()方法访问内容提供程序时,我遇到了崩溃:

04-15 23:05:33.699: ERROR/AndroidRuntime(3564): Caused by: java.lang.NullPointerException
04-15 23:05:33.699: ERROR/AndroidRuntime(3564):     at android.content.ContentResolver.acquireProvider(ContentResolver.java:727)
04-15 23:05:33.699: ERROR/AndroidRuntime(3564):     at android.content.ContentResolver.query(ContentResolver.java:239)
04-15 23:05:33.699: ERROR/AndroidRuntime(3564):     at squirrel.DeaddropDroid.DeaddropDB.query(DeaddropDB.java:482)

违规行是:

final Cursor blog2 = db.query(DeaddropDB.BLOG_TABLE, new String[] {
            DeaddropDB.KEY_ID, DeaddropDB.KEY_DATE,
            DeaddropDB.KEY_BLOG_SUMMARY }, null, null,
            DeaddropDB.KEY_DATE + " DESC");

db是一个DB对象,构造函数将活动的上下文作为参数。 在同一活动中,以下行按预期工作并给出正确的结果:

final Cursor blog = managedQuery(DeaddropDBProvider.BLOG_URI,
            new String[] {DeaddropDB.KEY_ID, DeaddropDB.KEY_DATE,
            DeaddropDB.KEY_BLOG_SUMMARY }, null, null,
            DeaddropDB.KEY_DATE + " DESC");

这证明我的ContentProvider正常运行并且已正确注册。我真的不知道这里发生了什么!为什么此查询不能像宣传的那样工作?

1 个答案:

答案 0 :(得分:2)

最后,正如所承诺的,我的答案。

是的,毕竟这是我的错(当然)。在Android的源代码中进行了一些挖掘(对开放源代码的另一个赞许),并通过一些进一步的测试我找到了原因。我的Uri是空的!我尝试从提供商导入uri但出现问题。 那将是我的下一个问题,因为当我有解决方法时,我不明白为什么会出错。

这是我的下一个问题:Load URI from myContentProvider fails (null result),因为我有一个有效的解决方案,我不明白为什么会出错。关于这个问题的进一步细节都在那里。