2013-04-20 165 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