user1903022
user1903022

Reputation: 1085

Delete item from both, database and listview on clicking Delete Button

I need to delete an item permanently from ListView and then from database. I have a DatabaseHandler.java class, which has the delete function as:

// Deleting single contact, in DatabaseHandler.java class
public void deleteContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
            new String[] { String.valueOf(contact.getID()) });
    db.close();
}

Then I have a FriendList.java class, when the user's friends are displayed as an item in ListView. When I long press on an item, then I get the option of "Delete" and "Cancel" in Dialog Box. Now, when I click on delete, the item is deleted from the ListView, but, not from the database. How can I delete it from database as well? The code for getting the option of "Delete" and "Cancel"

listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {


      @Override
      public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
              int position, long id) {
          // TODO Auto-generated method stub
                  Intent i = new Intent(FriendList.this, Delete_Confirm.class).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
  //I am sending position of listitem in putExtra below//     
          i.putExtra("position", position);
          startActivityForResult(i,CONFIRM);
          item2 = (String) arg0.getItemAtPosition(position);


          //Toast.makeText(FriendList.this, "Clicked"+item2, Toast.LENGTH_SHORT).show();
          int l = item2.length();
          c=0;
          for(int j=0; j<=l; j++){
              if(item2.charAt(j) != '9' || item2.charAt(j+1) != '1'){
                  c++;                   
              }
              else {
                  //Do nothing
                  break;
              }
              num = item2.substring(c, l);  

          }


          Toast.makeText(FriendList.this, "Clicked: "+num, Toast.LENGTH_SHORT).show();
          return true;


      }
      }); 

The corresponding code for onActivityResult is as follows:

@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
  super.onActivityResult(reqCode, resultCode, data);

  switch (reqCode) {
  case (CONFIRM) :
  if(resultCode==RESULT_OK){
      int posi = data.getIntExtra("position",0);
          Log.d("msg","position is " + posi);

          Log.d("msg","Do we reach here?");
          final StableArrayAdapter adapter = new StableArrayAdapter(this,
                    android.R.layout.simple_list_item_1, list);
                    //db.deleteContact(posi);
                    list.remove(posi);

                  listview.setAdapter(adapter);
          adapter.notifyDataSetChanged();


  }

    break;

}}

Please suggest how can I delete it from database as well. Any help would be highly appreciated.

EDIT: On uncommenting db.deleteContact(posi), I get the following error: The method deleteContact(Contact) in the type DatabaseHandler is not applicable for the arguments (int)

Note that the function deleteContact has contact variable of the type Contact.

Upvotes: 2

Views: 3618

Answers (4)

I think the problem is that position is not the corresponding id in the database. A possible solution would be to add a tag with the database id of the contact you have in this listitem. And when you remove it you get the tag with the id and delete the item from the database.

Edit (added clarification):

I would add in your listviewadapter something like:

yourcontactview.setTag(contact.getId());

in which you add to your view a tag with the database id of the corresponding contact.

Then where you delete the contact I would get the contact you want to delete with something like this:

Contact deletecontact = db.getContact(view.getTag());
db.deleteContact(deletecontact);

Of course you could change your deleteContact(Contact contact) to a method in which you give the id instead of the contactobject.

This should hopefully work.

Upvotes: 0

Jon..
Jon..

Reputation: 440

When you delete.... Try Deleting first from database then from ListView..
example:

 db.deleteContact(list.get(posi));  // this will get string  
 list.remove(posi);  

DatabaseHandler class.......

public void deleteContact(String name){
    Log.d("Name:",""+ name);
    db.delete(TABLE_CONTACTS, KEY_NAME + " = ?", new String[] { name });

}                                                                  

Upvotes: 1

Sean Zhang
Sean Zhang

Reputation: 108

You can delete from database first then from ListView. And suggest Iterator to remove list element.

Upvotes: 0

Ari M
Ari M

Reputation: 1426

Its a compilation error. You need to pass a Contact object to the method, not an integer.

Upvotes: 2

Related Questions