基本的に、SQLite データベースをカプセル化する ContentProvider を作成しようとしています。私はオンラインであらゆる場所を調べ、いくつかの異なるチュートリアルに従いましたが、同じ問題が発生し続けています。多くの人が同じ質問をしていることに気付きましたが、そこにあるアドバイスはどれも役に立ちませんでした。
基本的に、SQLiteOpenHelper で「getWriteableDatabase」を呼び出すたびに、null ポインター例外がスローされ、何も作成されません。これが私のコードです:
public class DatabaseProvider extends ContentProvider{
private static int DATABASE_VERSION = 1;
public static final String GRADE_COMPOSITION_TABLE = "gradecompositiontable";
public static final String GRADE = "Grade";
public static final String CLASS = "Class";
public static final String CLASS_CODE = "Class_Code";
public static final String ACTIVITY_CODE_TABLE = "activitycodetable";
//CLASS_CODE
public static final String ACTIVITY_CODE = "Activity_Code";
MainDatabaseHelper dbHelper;
public SQLiteDatabase dBase;
@Override
public Uri insert(Uri uri, ContentValues values) throws SQLiteException{
System.out.println("Helper: " + dbHelper);
dBase = dbHelper.getWritableDatabase(); <<<Null exception here
return null;
}
@Override
public boolean onCreate(){
dbHelper = new MainDatabaseHelper(getContext());
return (dbHelper == null)?false:true;
}
protected static final class MainDatabaseHelper extends SQLiteOpenHelper{
public static String overallDBName = "TeachMEDatabase";
private static final String SQL_CREATE_GRADE_COMP_TABLE =
"CREATE TABLE " +
GRADE_COMPOSITION_TABLE +
"(" +
GRADE + " INTEGER, " +
CLASS + " TEXT, " +
CLASS_CODE + " INTEGER PRIMARY KEY)";
public MainDatabaseHelper(Context context){
super(context, overallDBName, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_GRADE_COMP_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
db.execSQL("DROP TABLE IF EXISTS " + GRADE_COMPOSITION_TABLE);
onCreate(db);
}
}
メイン アクティビティからこのオブジェクトを作成し、「挿入」を呼び出すまではすべて正常に動作します。これがクラッシュするときです。
編集:これがスタックトレースです
04-09 21:53:46.301: E/AndroidRuntime(3397): Uncaught handler: thread main exiting due to uncaught exception
04-09 21:53:46.307: E/AndroidRuntime(3397): java.lang.RuntimeException: Unable to start activity ComponentInfo{sioy.teachme/sioy.teachme.TeachMEFirstActivity}: java.lang.NullPointerException
04-09 21:53:46.307: E/AndroidRuntime(3397): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
04-09 21:53:46.307: E/AndroidRuntime(3397): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
04-09 21:53:46.307: E/AndroidRuntime(3397): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
04-09 21:53:46.307: E/AndroidRuntime(3397): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
04-09 21:53:46.307: E/AndroidRuntime(3397): at android.os.Handler.dispatchMessage(Handler.java:99)
04-09 21:53:46.307: E/AndroidRuntime(3397): at android.os.Looper.loop(Looper.java:123)
04-09 21:53:46.307: E/AndroidRuntime(3397): at android.app.ActivityThread.main(ActivityThread.java:4363)
04-09 21:53:46.307: E/AndroidRuntime(3397): at java.lang.reflect.Method.invokeNative(Native Method)
04-09 21:53:46.307: E/AndroidRuntime(3397): at java.lang.reflect.Method.invoke(Method.java:521)
04-09 21:53:46.307: E/AndroidRuntime(3397): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-09 21:53:46.307: E/AndroidRuntime(3397): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-09 21:53:46.307: E/AndroidRuntime(3397): at dalvik.system.NativeStart.main(Native Method)
04-09 21:53:46.307: E/AndroidRuntime(3397): Caused by: java.lang.NullPointerException
04-09 21:53:46.307: E/AndroidRuntime(3397): at sioy.teachme.data.DatabaseProvider.insert(DatabaseProvider.java:54)
04-09 21:53:46.307: E/AndroidRuntime(3397): at sioy.teachme.TeachMEFirstActivity.onCreate(TeachMEFirstActivity.java:15)
04-09 21:53:46.307: E/AndroidRuntime(3397): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-09 21:53:46.307: E/AndroidRuntime(3397): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
04-09 21:53:46.307: E/AndroidRuntime(3397): ... 11 more