在我的应用程序中,我正在将数据库访问包装到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正常运行并且已正确注册。我真的不知道这里发生了什么!为什么此查询不能像宣传的那样工作?
答案 0 :(得分:2)
最后,正如所承诺的,我的答案。
是的,毕竟这是我的错(当然)。在Android的源代码中进行了一些挖掘(对开放源代码的另一个赞许),并通过一些进一步的测试我找到了原因。我的Uri是空的!我尝试从提供商导入uri但出现问题。 那将是我的下一个问题,因为当我有解决方法时,我不明白为什么会出错。
这是我的下一个问题:Load URI from myContentProvider fails (null result),因为我有一个有效的解决方案,我不明白为什么会出错。关于这个问题的进一步细节都在那里。