2011-04-16 39 views
2

对不起,也许很差的标题,不知道如何描述这个好。从myContentProvider加载URI失败(空结果)

我写我自己的ContentProvider称为DeaddropDBProvider,其中包括以下行来设置一些常数的URI来提供的内容:

public static final String PROVIDER_NAME = 
    "squirrel.deaddropdroid.deaddropdbprovider"; 
public static final Uri BLOG_URI = 
    Uri.parse("content://"+ PROVIDER_NAME + "/blog"); 

现在去这些URI,我访问他们两种不同的方式。一个有效,另一个失败,我不明白为什么。

失败方法:

方法1):直接调用。方法2):将URI作为常量导入;这样可以正常工作(缩写代码):

public class DeaddropDB { 
    public void getData(...) { 
     Cursor cursor = context.getContentResolver().query(DeaddropDBProvider.BLOG_URI, 
       columns, selection, selectionArgs, orderBy); 
    } 
} 

方法2):将URI导入为常量;然后拨打电话。这在我尝试使用该URI时给出了NullPointerException,因为URI仍然为空。

public class DeaddropDB { 
    public static final Uri BLOG_URI = DeaddropDBProvider.BLOG_URI; 
    public void getData(...) { 
     Cursor cursor = context.getContentResolver().query(BLOG_URI, 
       columns, selection, selectionArgs, orderBy); 
    } 
} 

第二种方法怎么不起作用?为什么BLOG_URI为空?

回答

0

尝试访问如下。

public class DeaddropDB { 
     public static final Uri BLOG_URI = Uri.parse("content://squirrel.deaddropdroid.deaddropdbprovide/blog"); 
     public void getData(...) { 
      Cursor cursor = context.getContentResolver().query(BLOG_URI, 
        columns, selection, selectionArgs, orderBy); 
     } 

} 
+0

您的解决方案的问题(我认为我自己已经被拒绝了),然后我再次硬编码第二类中的URI。我在ContentProvider类中设置了这个URI,如果因为某种原因我想稍后再进行更改,应该只在一个地方进行更改。我使用的解决方案已经存在。而且,这不是对这个问题的回答,“这是为什么它不起作用?”。 – Wouter 2011-04-17 14:20:40

1

我看到这是在这一点上陈旧的问题,但因为它没有一个答案,我想我会在我的2美分扔...

我认为这是失败的,因为你的当DeaddropDB.BLOG_URI初始化时,DeaddropDBProvider.BLOG_URI未完全初始化。

我不是Java专家,但我知道静态变量是在您第一次访问某个类时定义的;但是,如果在类A中有引用类B的初始化器,然后类B尝试引用类A,则Java可能无法正确处理该情况,所以如果DeaddropDBProvider尝试从DeaddropDB读取任何内容以初始化静态变量,则可能存在冲突。

我的建议是创建一个DeaddropDBSettings类,其他类都读取。这样你就不会结束相互初始化冲突。