0

こんにちは、すべてのレコードがデータベースからリストビューに表示されるデータベース アプリケーションを作成しています。ユーザーがリストビューで選択したアイテムを長押しすると、リストビューから表示する必要があります。各アイテムに ID を追加し、リストビューの問題から選択した ID でアイテムを削除しています。アイテムが削除され、新しいアイテムを挿入すると、IDが増加し、リストビューで選択したアイテムと一致しません。事前に助けてください...

リストビューでのユーザー長押しのコードは次のとおりです

list.setOnItemLongClickListener(new OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {

            View v=findViewById(R.id.groupList);
            //activity.openContextMenu(v);

            helper.deleteName((arg2+1));
            c.requery();                
            return true;
        }
    });

ここにデータベースからアイテムを削除するロジックがあります

class DatabaseHelper{

    public void insertGroup(String name){
        db.execSQL("insert into GroupNames (names) values('"+name+"')");
    }

    public Cursor selectAll(){
        return db.rawQuery("select * from GroupNames", null);
    }

    public String getName(Cursor c){
        return c.getString(0);
    }

    public void deleteName(int i){

        c.moveToPosition(i);
        db.execSQL("delete from GroupNames where _id="+i);          
    }
}
4

2 に答える 2

0

arg2はアイテムの ID ではありません。公式ドキュメントを参照して、それが何であるかを理解してください。

arg3データベース内の項目の ID ではなく、Android リソースの行 ID (つまり R.id.xxx) であるため、 のパラメーターによって指定されたデータをそのまま使用することはできませんonItemLongClick()

これを知っていれば、行helper.deleteName((arg2+1));が正しくなく、何の意味もないことarg2+1がわかります。データベースにとってはまったく意味がありません。

解決策(私が思うに最善ではありません)は、アイテムビューに非表示のフィールドを含めて_idデータベースの実際のフィールドを保存することです。次に、長押しが検出されると、この値を取得して に渡しますhelper.deleteName()

于 2013-06-05T09:02:36.567 に答える
0

コードをログに記録して控えめにする必要があると思います。どのデータがどこに行くのですか?

以下のコードでは、何かを削除すると、削除されたかどうかを理解できるように応答が返されます。

 public int deleteAlarm(long unique_id) {
              db = this.getWritableDatabase();
              int delete = db.delete(ALARM_TABLE_NAME, "unique_id=" + unique_id, null);
              db.close();
              return delete;
        } 
于 2013-06-05T09:17:38.620 に答える