마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리스트뷰와 db 동시에 삭제하는 방법 질문드립니다.

0 추천

리스트를 꾹 눌러서 삭제하면 그 position에 맞는 id값을 가진 데이터를 삭제하게 구현했는데요

생각해보면 방법이 틀린것같아서요

position은 0부터 시작해서 삭제할 때 position + 1을 주어서 삭제하게했습니다

pos : 0 1 2

id :  1  2 3 이렇게 있을 때 만약 2번째를 삭제하면

pos : 0 1

id:    1 3 이렇게 되는거같은데 제 생각이 맞는지는 모르겠습니다.

몇번삭제하고나면 마지막엔 하나가 꼭 안지워지더라고요

position값과 id값이 다르게 지워지는거 같은데

좋은방법 없을까요??

mListView.setAdapter(mAdapter);
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent,
                                   View view, int position, long id) {
        Log.i(TAG,"cursor position =" + mCursor.getPosition());
        boolean result = mDbOpenHelper.deleteColumn(position + 1);
        Log.i(TAG, "result = " + result);

        if (result) {
            mInfoArr.remove(position);
            mAdapter.setArrayList(mInfoArr);
            mAdapter.notifyDataSetChanged();
        }
        else {
            Toast.makeText(MainActivity.this, "INDEX를 확인해 주세요",
                    Toast.LENGTH_SHORT).show();
        }
        return false;
    }
});
public boolean deleteColumn(long id) {
    Log.i("id : ", valueOf(id));
    return mDB.delete(DataBases.CreateDB._TABLENAME, "_id=" + id, null) > 0 ;
}

 

 

bowwow (220 포인트) 님이 2017년 1월 20일 질문

4개의 답변

0 추천
리스트 뒤에서부터 삭제하시면 질문자님꼐서 고민하고 계신 문제는 해결 될거 같은데요.

 

0 1 2 3 이면

3

2

1

0

 

이 순서대로 삭제 하시면 되지 않을까요?
Development Guy (70,570 포인트) 님이 2017년 1월 20일 답변
선택한것을 삭제할수있게 해야됩니다 ㅠㅠ
0 추천
DB를 먼저 지우고 난다음 리스트뷰는 기존 데이터 클리어 한뒤 DB 데이터를 읽어와서 뿌려주면 될꺼 같은데요..
익명사용자 님이 2017년 1월 20일 답변
어떤식으로 해야댈지 모르겠습니다
0 추천

position 이 아니라 onItemLongClick의 long id가 db에 있는 고유 아이디를 반환하게 만들어야 합니다. 그 아이디를 db에서 삭제하라고 해야하는 거죠. 

쎄미 (162,410 포인트) 님이 2017년 1월 20일 답변
public boolean onItemLongClick(AdapterView<?> parent,
                                           View view, int position, long id)
여기서 저는왜 id값이 항상 0으로 나올까요 ㅠㅠ
mAdapter의 getItemId() 에 뭐라고 적혀있나요?
return 0으로 되어있습니다
그걸 db의 id를 리턴하게 해보세요.
어떻게해야댈지 모르겠어요 ㅠㅠ
adapter에서 db에 들어있는 아이템들을 들고 있을텐데, 거기서 id를 가져와야죠.
https://github.com/susemi99/TestDBListView
감사합니다 해결했습니다
0 추천
인덱스를 쓰는건 좋지만 순서를 역순으로 하는 등의 신경써야할 부분이 많습니다.

api를 찾아보시면 나오지만  remove(Object)가 사용가능하기 때문에 굳이 인덱스 고민을 할필요도없고

다시 DB를 불러와야 할 이유도 없습니다. 그리고 DB지우는 코드가 완전히 잘못된거 같네요...(이건 다른문제니)
라쎄린드 (25,460 포인트) 님이 2017년 1월 20일 답변
...