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

cursoradapter 에서 db에 있는 테이블 값 삭제하는방법

0 추천
안녕하세요 CURSOR ADAPTER 사용해서 주소록을 따로 만들고 있는데요

그 주소록에서 이름 옆에 보면 전화걸기 문자보내기 이런 버튼 있자나요

맨 옆에 삭제하기 버튼을 누르면 리스트에서 그 주소가 사라지게 하고 싶은데요

일단 리스트는 DB에 저장되어 있는 값을 뿌려서 보여주고 있습니다.

public class addphoneAdapter extends CursorAdapter {
 
 

 public addphoneAdapter(Context context, Cursor c) {
  super(context, c);
 
 }

 @Override
 public void bindView(View view, final Context context, final Cursor cursor) {

  String strID = cursor.getString(0);
  final TextView name = (TextView) view.findViewById(R.id.name);
  final TextView phone = (TextView) view.findViewById(R.id.phonenum);
  final Context t = context;

  // image.setImageResource(R.drawable.ic_launcher);
  name.setText("이름 : " + cursor.getString(cursor.getColumnIndex("name")));
  phone.setText("전화번호 : "
    + cursor.getString(cursor.getColumnIndex("phonenumber")));

  ImageButton ib_call = (ImageButton) view.findViewById(R.id.button_call);
  ImageButton ib_message = (ImageButton) view
    .findViewById(R.id.button_message);
  ImageButton ib_del = (ImageButton) view
    .findViewById(R.id.button_del);

  
  int position = cursor.getPosition();
  ib_call.setTag(position);
  ib_message.setTag(position);
  ib_del.setTag(position);
  

  ib_call.setOnClickListener(new View.OnClickListener() {

   public void onClick(View v) {
    
    int position= Integer.parseInt((v.getTag().toString()));
    cursor.moveToPosition(position);

    Intent i = new Intent(Intent.ACTION_CALL,
      Uri.parse("tel: "
        + cursor.getString(cursor
          .getColumnIndex("phonenumber"))));
    context.startActivity(i);

   }
  });

  ib_message.setOnClickListener(new View.OnClickListener() {

   public void onClick(View v) {
    
    int position= Integer.parseInt((v.getTag().toString()));
    cursor.moveToPosition(position);
    String data = (cursor.getString(cursor
      .getColumnIndex("phonenumber")));
    Intent i = new Intent(context, Send_sms.class);
    i.putExtra("phonedata", data );
    context.startActivity(i);

   }
  });
  
  ib_del.setOnClickListener(new View.OnClickListener() {

   public void onClick(View v) {
   
    int position= Integer.parseInt((v.getTag().toString()));
    
    cursor.moveToPosition(position);
   

   }
  });
 }

 protected void startActivity(Intent i) {
  // TODO Auto-generated method stub

 }

 @Override
 public View newView(Context context, Cursor cursor, ViewGroup parent) {
  LayoutInflater inflater = LayoutInflater.from(context);
  View v = inflater.inflate(R.layout.addphonenumlay, parent, false);

  return v;
 }

}

이런식으로 아답터를 구현했고 ib_del 버튼이 지우는 버튼입니다.

public class addphone extends Activity {
   
 ListView list;
 dbHelper dbHelper;
 SQLiteDatabase db;
 String sql;
 Cursor cursor;
 Button addbtn;
 
 final static int Suchfriends =0;
final static int Inputfriends =1;
 
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.friendsadd);
       
        dbHelper = new dbHelper(this);
        try{
         db = dbHelper.getWritableDatabase();
        } catch (SQLiteException ex){
         db = dbHelper.getReadableDatabase();
        }
        //db사용하겠다

        sql = "SELECT * FROM friends;";
        cursor = db.rawQuery(sql, null);
        list = (ListView)findViewById(R.id.list);
        list.setOnItemClickListener(new OnItemClickListener() {

   @Override
   public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    cursor.moveToPosition(position);
    String str = cursor.getString(cursor.getColumnIndex("name"));
    Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
   }
  });               
    
     
    
         startManagingCursor(cursor);
         addphoneAdapter dbAdapter = new addphoneAdapter(this, cursor);
         list.setAdapter(dbAdapter);
         
         //db.close();
        // cursor.close();
  addbtn = (Button)findViewById(R.id.addfriends);
  addbtn.setOnClickListener(new View.OnClickListener() {
        
   public void onClick(View v) {               
   
    this.DialogSelectOption();
   
   }
   

 

요긴 뿌려주는 엑티비티고, 필요한 부분인듯한곳만 가져왔습니다.

인터넷 뒤져보니까 array 배열식으로 주던데

저는 일단 배열로 뭘 한건 없는거 같아서 ...

위치는 대충 다른 버튼처럼 잡아주면 될거같은데

db에서 지우고 리스트에서도 지우는 방법을 모르겠습니다.

답변 부탁드릴께요
모하지모해 (300 포인트) 님이 2013년 6월 4일 질문

1개의 답변

0 추천
 
채택된 답변

 

sql = "DELETE FROM friends WHERE _id=$지워야할_필드의_id값";
cursor = db.rawQuery(sql, null);

 

aucd29 (218,390 포인트) 님이 2013년 6월 4일 답변
모하지모해님이 2013년 6월 4일 채택됨
답변 감사합니다.
그런데 커서아답터 버튼부분에서 클릭 이벤트를 줘야 하는거 같은데
커서아답터에는 sql 이나 db 부분이 선언이 안되어 있고
커서아답터에 dbhelper나 이런거 쓰면 오류가 나는데
저부분을 어떤식으로 써야하는지 조금만 더 자세히
알수 없을까요??
제가 초보로 조금만 자세한 설명 부탁드리겠습니다.
addphoneAdapter 를 addphone 내 inner class 로 생성하면  dbhelper 에 접근 가능 합니다.
감사합니다. 말씀하신대로 inner class로 생성해서
뭔가 될거같네요 ㅎㅎ
그런데 저기 지워야할 필드의 값이라는건
선택된 _ID를 쓰라는 이야기인가요???
선택되는 아이템 이름을 _id=$ 여기 뒤에다가
쓰라는 말이맞는거죠?? ;;
귀찮게 여러번 질문해서 죄송합니다. \
aucd님 죄송한데 ... 제가 어제 부터 지금까지 계속 인터넷 뒤져가며
선택된것을 지우려고 하고 있는데
못하고 있네요
실례가 안되면 소스 한번 보시고 ... 그 delete 하는부분에
어떻게 소스를 써야하는지 알려주실수 있을런지요..ㅜㅜ
아 이런방법이구나는 알겠는데
해결이 안나네요ㅜㅜ
db 를 생성하려면 기본적으로 _id  즉 primary key 값이라는 절대 고유의 숫자가 있습니다.
보통의 경우 해당 번호를 이용해서 지웁니다. 디비를 어떻게 만드셨는지 모르겠으나 디비에 _id 이름으로 primary key 를 만들고 그걸 이용해서 지웁니다.

_id 값을 bindView 내에서 할당을 한 뒤 delete click event 에서 해당 값을 기준으로 delete query를 날리면 됩니다.
네 db에서 _id 를 프리머리키로 주고 자동으로 증가하는걸로 해놨는데요. 어떤 _id 딱딱 삭제하는게 아니고 리스트에 뿌려져있는것을
클릭시 그러니까 그포지션이 눌리면 삭제하는건데
delete query 부분에 where _id =$ 하고 뒤에 부분에 뭐라고 써야할지를 모르겠습니다..;; 조건을 어떻게 줘야 내가 선택한것이 되는지를 잘모르겠네요 인터넷상에서는 대부분 array 로 묶어있어서 그부분을 건드리던데 전 그런거도 아니고 해서요
1. list 에 field 마다 _id 에 해당 하는 값을 할당 합니다. 이는 bindView 에서 진행 하면 됩니다. 할당 위치는  직접 정하세요  gone 시킨 객체 던지 tag  에 넣던지 하면 됩니다.
2. 선택 했을 때 1에서 할당한 _id 값을 참조해서 DELETE query를 생성 후 전달 합니다.
3. query를 전달 후 adapter.notifyDataSetChanged(); 를 호출 하면 변경된 값을 리스트에 적용 시킵니다.

http://developer.android.com/intl/ko/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

ps. 책한권 사세요, 이런 기본적인 내용을 숙지 하지 않고 코딩은 불가능 합니다.
...