-1

各カテゴリの下にカテゴリとアイテムを含む拡張可能なリスト アダプターがあります。アイテムを削除するためにクリックすると、削除を確認する警告ダイアログが表示されます。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] (実行中)

4

1 に答える 1

0

変数 dbHelper が初期化されていません...

private DbHelper dbHelper;

この行はクラッシュします

dbHelper.deleteItemizedSpending(group.category_name, children.row_id, children.item_amount);   
于 2013-09-08T00:41:52.087 に答える