各カテゴリの下にカテゴリとアイテムを含む拡張可能なリスト アダプターがあります。アイテムを削除するためにクリックすると、削除を確認する警告ダイアログが表示されます。yes
デバッガーを押すdbHelper.deleteItemizedSpending
と、常にNullPointerException
. 内部にブレークポイントを設定しましたdeleteItemizedSpending
が、fn に入りません。
データベースはすでに初期化されており、メイン アクティビティで書き込み用に開かれています。また、パラメータgroup.category_name
、がすべて有効children.row_id
であることも確認しました。children.item_amount
ここで何が問題なのですか?
ファイル ExpandableCategoryListAdapter.java (関連するコードのみをコピー):
public class ExpandableCategoryListAdapter extends BaseExpandableListAdapter {
private DbHelper dbHelper;
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
final Children children = (Children) getChild(groupPosition, childPosition);
// get a hold of layout elements
if (convertView == null) {
convertView = inflater.inflate(R.layout.child_row, null);
}
TextView tag = (TextView) convertView.findViewById(R.id.textCategoryItemTag);
TextView amount = (TextView) convertView.findViewById(R.id.textCategoryItemAmount);
ImageView edit = (ImageView) convertView.findViewById(R.id.editCategoryItem);
ImageView delete = (ImageView) convertView.findViewById(R.id.deleteCategoryItem);
tag.setText(children.tag_name);
amount.setText(Integer.toString(children.item_amount));
// method to handle edit item icon click
// method to handle delete item icon click
delete.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Delete?");
builder.setCancelable(true);
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Group group = (Group) getGroup(groupPosition);
dbHelper.deleteItemizedSpending(group.category_name, children.row_id,
children.item_amount);
// then remove row from dataset and notify that it changed
List<Children> child = groups.get(groupPosition).children;
child.remove(childPosition);
notifyDataSetChanged();
}
});
ファイル DbHelper.java (関連するコードのみをコピー):
public class DbHelper {
private Context context;
private SQLiteDatabase db;
private Database dbHelper;
public DbHelper(Context context) {
this.context = context;
dbHelper = new Database(this.context);
}
public void open() throws SQLException {
db = dbHelper.getWritableDatabase();
}
public void deleteItemizedSpending(String table, long id, int amount) {
int travel_id = fetchTravelId(table, id, amount);
try {db.delete(
table,
DatabaseContract.CategoryTable._ID + "=?" + " AND " +
DatabaseContract.CategoryTable.COLUMN_AMOUNT + "=?",
new String[] {String.valueOf(id), String.valueOf(amount)});}
catch (Exception e)
{
Log.e("DB ERROR 3", e.toString());
e.printStackTrace();
}
スタックトレース:
DalvikVM[localhost:8603]
スレッド [<1> メイン] (中断 (例外 NullPointerException))
ExpandableCategoryListAdapter$1$1.onClick(DialogInterface, int) 行: 70
AlertController$ButtonHandler.handleMessage(Message) 行: 167
AlertController$ButtonHandler(Handler) .dispatchMessage(Message) 行: 99
Looper.loop() 行: 137 ActivityThread.main(String[]) 行: 4950
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) 行: 利用不可 [ネイティブメソッド]
Method.invoke(Object, Object...) 行: 511
ZygoteInit$MethodAndArgsCaller.run() 行: 1004 ZygoteInit.main(String[]) 行: 771 NativeStart.main(String[]) 行: 利用不可 [ネイティブ メソッド]
スレッド [<10> Binder_2] (実行中)
スレッド [< 9> Binder_1] (実行中) スレッド [<11> Binder_3] (実行中)