我知道这是一个常见的问题,但我发现的任何内容都无法解决我的问题。我已经创建了一个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,我也不想用代码压倒那些人。无论如何,如果你有任何建议,那就太好了,谢谢!
答案 0 :(得分:4)
我看到您在代码中实例化您的提供程序,这是您不应该做的事情,因为ContentProvider
由Android系统管理。使用ContentProvider
的正确方法是使用ContentResolver
,Activity
可以getContentResolver()
获取ContentProviders
。
您可以在Android开发者网站的official tutorial找到有关{{1}}以及如何使用它们的更多信息。