2011-04-16 84 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類,其他類都讀取。這樣你就不會結束相互初始化衝突。