私はこれが一般的な問題であることを知っていますが、私が見つけたものは何も私の問題を解決しません。ここのチュートリアルに厳密に従って、ContentProviderを作成しました。私のアクティビティは、super.onCreateの直後のonCreateメソッドで次のように実行されます。
StitchProvider stitchProvider = new StitchProvider();
stitchProvider.delete(STITCHES_URI, null, null);
StitchProviderは私のContentProviderです。デバッガーを介してこのコードをたどり、ブレークポイントを配置する場所に応じて、2つのいずれかが発生しますが、どちらもLogCatでNullPointerExceptionが発生します。最初のオプションは、ここにブレークポイントを設定することです。
public SQLData(Context c) {
super(c, DATABASENAME, null, DATABASEVERSION);
}
SQLDataは私のデータベースクラスです。ここにブレークポイントを設定すると、コンテキストであるcがandroid.app.Application@412a9b80に等しいことがわかります。次に、コードはStitchProviderのonCreateメソッドに戻ります。
public boolean onCreate() {
mDB = new SQLData(getContext());
return true;
}
mDBはcom.MyKnitCards.project.SQLData@412ab668になります。これまでのところ良いと思いますが、returnステートメントを通過しようとすると、NullPointerExceptionが発生します。ブレークポイントをStitchProviderのdeleteメソッド内に移動すると、getWriteableDatabase行に到達するまですべてが正常に実行され、その時点でNullPointerExceptionが発生します。StitchProviderのdeleteメソッドは次のとおりです。
public int delete(Uri uri, String selection, String[] selectionArgs) {
int uriType = sURIMatcher.match(uri);
int rowsAffected = 0;
switch (uriType)
{
case STITCHES:
SQLiteDatabase sqlDB = mDB.getWritableDatabase();
rowsAffected = sqlDB.delete(STITCHTABLE_BASEPATH, selection, selectionArgs);
break;
case STITCHES_ID:
SQLiteDatabase sqlDBwithID = mDB.getWritableDatabase();
String id = uri.getLastPathSegment();
if (TextUtils.isEmpty(selection))
{
rowsAffected = sqlDBwithID.delete(STITCHTABLE_BASEPATH, SQLData.KEY_ROWID + "=" + id, null);
}
else
{
rowsAffected = sqlDBwithID.delete(STITCHTABLE_BASEPATH, selection + " and " + SQLData.KEY_ROWID + "=" + id, selectionArgs);
}
break;
default:
throw new IllegalArgumentException("Unknown or Invalid URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsAffected;
}
私が気づいたことの1つは、SQLDataのonCreateメソッドにブレークポイントを設定すると、そこに到達できないことです。問題の一部はデータベースが作成されていないことだと思いますが、理由はわかりません。人々が望むだけ多くのコードまたはLogCatを投稿します。つまり、コードで人々を圧倒したくないのです。とにかく、いつものように、何か提案があれば、それは素晴らしいことです、そしてありがとう!