2016-05-02 3 views
0

Я хочу удалить элемент из базы данных listView и SQLite с помощью contextMenu (нажмите на элемент и удерживайте кнопку «Удалить», нажмите кнопку «Удалить» и нажмите «Удалить»), и мой код ничего не удаляет. Я попытался, нажав на Delete, тост с текстом появляется, и это сработало.Удаление элемента из SQLite и 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; 
    } 

ПОЛНЫЙ КОД:

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(); 
    } 


} 

ответ

0

Вы не удаление элемента из списка books. Если books является ArrayList то Изменить строку кода

books.remove(info.position); 

И удалить из базы данных (если книги является ArrayList пользовательского типа).

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

И если книги является ArrayList строки, то

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

Моего приложения с сохранением и извлечением кнопок (При нажатии кнопки извлечения, появляется весь список). Он удаляет элемент, но при повторном нажатии Retrieve btn он появляется снова, поэтому это означает, что он не удаляет из базы данных. Когда я пытался использовать db.delete (books.get (info.position)); это было «К сожалению, библиотека остановилась». Я отредактировал мой пост и вставил полный код – Deividito

+0

Он удаляет, но теперь я нашел одну ошибку: например, у меня есть 3 элемента для удаления («1», «2» и «3»), я нажимаю delete на элементе «1», но удаляет элемент «2», я нажимаю элемент «2», он удаляет «3», но если я нажимаю кнопку «3», сбой приложений – Deividito

+0

Я не понимаю, что происходит: D – Deividito

Смежные вопросы