点击 Add data按钮时程序闪退。
Logcat里显示出错信息为
java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List android.net.Uri.getPathSegments()' on a null object reference.
调试时将
newId = newUri.getPathSegments().get(1);
标注掉后,点击Add data 不闪退,
但点击 Query data 无输出。
结合出错信息“空指针”,猜想newUri没有被正确的赋值。inser操作没有生效。
检查DatabaseTest项目中自定义DatabaseProvider类的insert操作
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO: Implement this to handle requests to insert a new row.
//throw new UnsupportedOperationException("Not yet implemented");
SQLiteDatabase database = databaseHelper.getWritableDatabase();
Uri uriReturn = null;
switch (uriMatcher.match(uri)){
case BOOK_DIR:
break;
case BOOK_ITEM:
long newBookId = database.insert("Book",null,values);
uriReturn = Uri.parse("content://" + AUTHORITY + "/book/" + newBookId);
break;
case CATEGORY_DIR:
break;
case CATEGORY_ITEM:
long newCategoryId = database.insert("Category",null,values);
uriReturn = Uri.parse("content://" + AUTHORITY + "/category/" + newCategoryId);
break;
default:
break;
}
return uriReturn;
}
ProviderTest中使用的insert操作对应BOOK_DIR的操作,结果被赋值为空指针,自然出现空指针异常。
将break;标注掉后,ProviderTest项目运行效果与书上相同,错误解决;
总结:
出错的原因为对switch-case语法的不熟悉,不同case的使用同一个操作时,可只写最后一个,中间不能加break。