2016-05-02 25 views
0

Ich möchte Element aus einer ListView und SQLite Datenbank mit contextMenu löschen (drücken Sie auf Objekt und halten, löscht die Schaltfläche erscheint, drücken Sie es und Element löscht) und mein Code entfernt nichts. Ich habe versucht, wenn Sie auf Löschen drücken, Toast mit Text erscheint und es hat funktioniert.Löschen eines Elements aus SQLite und listView

DBAdapter.java

public void delete(String name)throws SQLException { 
     SQLiteDatabase db = helper.getWritableDatabase(); 
     if (db == null) { 
      return; 
     } 
     String[] whereArgs = new String[] { name }; 
     db.delete("m_TB", "NAME"+ "=?", whereArgs); 
     db.close(); 
    } 

MainActivity.java

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.add("Delete"); 
    } 

    public boolean onContextItemSelected(MenuItem item) { 
     super.onContextItemSelected(item); 
     AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
     String name = info.toString(); 
     if (item.getTitle().equals("Delete")) { 
      db.delete(name); 
      books.remove(item); 
      adapter.notifyDataSetChanged(); 

     } 
     return true; 
    } 

FULL CODE:

MainActivity.java

public class MainActivity extends AppCompatActivity { 


    ListView lv; 
    EditText nameTxt; 
    Button savebtn, retrievebtn; 
    ArrayList<String> books = new ArrayList<String>(); 
    ArrayAdapter<String> adapter; 
    SearchView sv; 
    /** 
    * ATTENTION: This was auto-generated to implement the App Indexing API. 
    * See https://g.co/AppIndexing/AndroidStudio for more information. 
    */ 
     private GoogleApiClient client; 

     final DBAdapter db = new DBAdapter(this); 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      nameTxt = (EditText) findViewById(R.id.editText); 

      savebtn = (Button) findViewById(R.id.saveBtn); 
      retrievebtn = (Button) findViewById(R.id.retrieveBtn); 

      lv = (ListView) findViewById(R.id.listView1); 

      adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, books); 



      registerForContextMenu(lv); 

      savebtn.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        db.openDB(); 
        long result = db.add(nameTxt.getText().toString()); 

        if (result > 0) { 
         nameTxt.setText(""); 
        } else { 
         Toast.makeText(getApplicationContext(), "Failure", Toast.LENGTH_SHORT).show(); 
        } 
        db.close(); 
       } 
      }); 
      retrievebtn.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        books.clear(); 
        db.openDB(); 
        Cursor c = db.getAllNames(); 

        while (c.moveToNext()) { 
         String colIndex = c.getString(1); 
         books.add(colIndex); 
        } 
        lv.setAdapter(adapter); 
        db.close(); 
       } 
      }); 
      lv.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        Toast.makeText(getApplicationContext(), books.get(position), Toast.LENGTH_SHORT).show(); 
       } 
      }); 
      // ATTENTION: This was auto-generated to implement the App Indexing API. 
      // See https://g.co/AppIndexing/AndroidStudio for more information. 
      client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 



    } 
     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
      super.onCreateContextMenu(menu, v, menuInfo); 
      menu.add("Delete"); 
     } 

     public boolean onContextItemSelected(MenuItem item) { 
      super.onContextItemSelected(item); 
      AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
      String name = info.toString(); 
      if (item.getTitle().equals("Delete")) { 
       books.remove(info.position); 
       adapter.notifyDataSetChanged(); 

      } 
      return true; 
     } 
    } 

DBAdapter.java

public class DBAdapter { 

    static final String ROW_ID ="id"; 
    static final String NAME ="name"; 
    static final String TAG = "DBAdapter"; 

    static final String DBNAME="m_DB"; 
    static final String TBNAME="m_TB"; 
    static final int DBVERSION='1'; 

    static final String CREATE_TB="CREATE TABLE m_TB(id INTEGER PRIMARY KEY AUTOINCREMENT," 
      + "name TEXT NOT NULL);"; 

    final Context c; 
    SQLiteDatabase db; 
    DBHelper helper; 
    public DBAdapter(Context ctx) { 
     this.c = ctx; 
     helper = new DBHelper(c); 
    } 


    private static class DBHelper extends SQLiteOpenHelper { 
     public DBHelper(Context context) { 
      super(context, DBNAME, null, DBVERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      try { 
       db.execSQL(CREATE_TB); 
      } catch (SQLException e) 
      { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.w("DBAdapter","Upgrading DB"); 
      db.execSQL("DROP TABLE IF EXISTS m_TB"); 
      onCreate(db); 
     } 
    } 
    public DBAdapter openDB() 
    { 
     try { 
      db=helper.getWritableDatabase(); 
     } catch (SQLException e) 
     { 
      Toast.makeText(c, e.getMessage(), Toast.LENGTH_LONG).show(); 
     } 
     return this; 
    } 

    public void close() 
    { 
     helper.close(); 
    } 

    public long add(String name) 
    { 
     try { 
      ContentValues cv = new ContentValues(); 
      cv.put(NAME,name); 
      return db.insert(TBNAME,ROW_ID,cv); 
     } catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
     return 0; 
    } 

    public Cursor getAllNames() 
    { 
     String[] columns={ROW_ID,NAME}; 
     return db.query(TBNAME,columns,null,null,null,null,null); 
    } 

    public void delete(String name)throws SQLException 
    { 
     SQLiteDatabase db = helper.getWritableDatabase(); 
     if(db == null) 
     { 
      return; 
     } 
     String[] whereArgs = new String[]{name}; 
     db.delete("m_TB", "NAME"+ "=?", whereArgs); 
     db.close(); 
    } 


} 

Antwort

0

Du books das Element aus der Liste nicht entfernen. Wenn books ein ArrayList ist dann ändern Codezeile

books.remove(info.position); 

Und aus der Datenbank zu entfernen (Wenn Bücher eine Arraylist von benutzerdefinierten Typ ist).

db.delete(books.get(info.position).name); 

Und wenn Bücher ist ein Arraylist der Zeichenfolge dann

db.delete(books.get(info.position)); 
+0

Meine Anwendung mit Speichern und Abrufen von Tasten (Wenn Sie abrufen drücken, werden alle Liste angezeigt wird). Es löscht das Element, aber wenn es gedrückt wird, ruft btn erneut auf, es erscheint erneut, so dass es nicht aus der Datenbank löscht. Als ich versuchte, db.delete zu verwenden (books.get (info.position)); Es war "Leider hat die Bibliothek aufgehört". Ich habe meinen Beitrag bearbeitet und den ganzen Code eingefügt – Deividito

+0

Es löscht, aber jetzt habe ich einen Fehler gefunden: Zum Beispiel habe ich 3 Elemente zu löschen ("1", "2" und "3") ich drücke auf Element "1" löschen, aber es löscht item "2", drücke ich lösche Element "2", es löscht "3" aber wenn ich delete drücke "3" Anwendung stürzt – Deividito

+0

Ich verstehe nicht, was passiert: D – Deividito

Verwandte Themen