2

私はこれが一般的な問題であることを知っていますが、私が見つけたものは何も私の問題を解決しません。ここのチュートリアルに厳密に従って、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を投稿します。つまり、コードで人々を圧倒したくないのです。とにかく、いつものように、何か提案があれば、それは素晴らしいことです、そしてありがとう!

4

1 に答える 1

4

ContentProviderプロバイダーをコードでインスタンス化しているようですが、Androidシステムによって管理されているため、実行してはいけないことです。aを使用する正しい方法は、 withで取得できるContentProvideraを使用することです。ContentResolverActivitygetContentResolver()

Android開発者サイトの公式チュートリアルContentProvidersで、それらの詳細と使用方法を見つけることができます。

于 2012-11-07T20:56:12.020 に答える