ContentProvider getWriteableDatabase返回NullPointerException

时间:2012-11-07 18:40:13

标签: android android-contentprovider

我知道这是一个常见的问题,但我发现的任何内容都无法解决我的问题。我已经创建了一个ContentProvider,紧跟教程here。 My Activity,在super.onCreate之后的onCreate方法中立即执行此操作:

StitchProvider stitchProvider = new StitchProvider();
stitchProvider.delete(STITCHES_URI, null, null);

StitchProvider是我的ContentProvider。我通过调试器跟踪了这段代码,并根据我放置断点的位置,发生了两件事之一,但两者都导致了LogCat中的NullPointerException。第一个选项是我在这里放置一个断点:

public SQLData(Context c) {
    super(c, DATABASENAME, null, DATABASEVERSION);
}

SQLData是我的数据库类。如果我把断点放在这里,我看到c,Context,等于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的删除方法:

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;
}

我注意到的一件事是,如果我在SQLData的onCreate方法中设置断点,我就永远不会到达那里。我认为部分问题是数据库没有被创建,但我不知道为什么。我会发布尽可能多的代码或LogCat,我也不想用代码压倒那些人。无论如何,如果你有任何建议,那就太好了,谢谢!

1 个答案:

答案 0 :(得分:4)

我看到您在代码中实例化您的提供程序,这是您不应该做的事情,因为ContentProvider由Android系统管理。使用ContentProvider的正确方法是使用ContentResolverActivity可以getContentResolver()获取ContentProviders

您可以在Android开发者网站的official tutorial找到有关{{1}}以及如何使用它们的更多信息。