2013-04-20 164 views
1

onCreate()ContentProvider中的方法未被調用。雖然當我點擊一個按鈕時,它會進入insert()方法並返回java.lang.NullPointerException。在onCreate()方法我已經只有在ContentProvider中的onCreate()未被調用

@Override 
public boolean onCreate() { 
     Log.v(TAG,"Inside create provider"); 
     database = new DatabaseSQLiteMyDB(getContext()); 
     return false; 
} 

登錄CAT表示:

04-20 01:23:00.543: V/CLICKED(1607): CLICKED 
04-20 01:23:00.553: V/Provider(1607): inside insert 
04-20 01:23:00.573: V/database(1607): created 
04-20 01:23:00.573: E/pkg.OnPut_ClickListener(1607): java.lang.NullPointerException 
04-20 01:23:00.583: V/pkg.OnPut_ClickListener(1607): In exception code 

在清單:

{ 
    myURI=buildUri("content", "somepkg.provider"); 
      this.putNo=putNo; 
      mContentValues = initTestValues(); 
    } 
     private Uri buildUri(String scheme, String authority) { 
      Uri.Builder uriBuilder = new Uri.Builder(); 
      uriBuilder.authority(authority); 
      uriBuilder.scheme(scheme); 
      return uriBuilder.build(); 
     } 
+0

請發出更多的代碼並通過logcat完整棧跟蹤 – Daniel 2013-04-20 05:21:33

+0

@sattu請發佈完整的StackList和更多代碼 – 2013-04-20 05:29:30

回答

0

您需要:

<provider android:name="somepkg.CustomContentProvider" 
      android:authorities="somepkg.provider" /> 

雖然在點擊創建URI顯示代碼在哪裏你執行插入。

對不起,其餘部分不直接針對這個問題,但它是我在代碼示例中關於ContentProviders的所有地方都看到的東西。

您不應該在ContentProvider onCreate中調用database = new DatabaseSQLiteMyDB(getContext());。這是SQLiteOpenHelper文檔getReadableDatabase和getWritableDatabase中給出的理由是:

像getWritableDatabase,這種方法可能需要很長的時間才能恢復, 所以你不應該從應用程序的主線程中調用它,包括 從ContentProvider的.onCreate()。

而是堅持一個SQLiteOpenHelper實例的引用和查詢/插入調用getWritableDatabase/getReadableDatabase適當/刪除它們,如果你正在使用裝載機異步調用/更新方法。

+0

您的回覆對我無效。你說不要在'onCreate'中實例化'SQLiteOpenHelper',而是引用getWritableDatabase/getReadableDatabase的文檔作爲證據。該文檔描述了可能長時間運行的數據庫創建延遲到第一次使用時,事實上說「如果您正在使用SQLite數據庫,您可以在ContentProvider.onCreate()中創建一個新的SQLiteOpenHelper對象」https://code.google.com/p/docs/docs/docs/docs/docs/default.aspx .android.com /引導/主題/提供商/內容提供商,creating.html#的OnCreate – JHS 2017-12-10 00:10:46