2016-05-02 35 views
0

私はcontextMenu(アイテムを押したままにして、削除ボタンが表示され、それを押してアイテムを削除します)とlistViewとSQLiteデータベースからアイテムを削除したいです。私は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

である私のアプリケーションは保存してあると(あなたが取得押すと、すべてのリストが表示されます)ボタンを取得します。アイテムを削除しますが、もう一度btnを押すと再び表示されるので、データベースから削除されません。私がdb.delete(books.get(info.position))を使用しようとしました。それは "残念ながら、図書館は止まった"。私は私のポストを編集し、完全なコードを挿入しました – Deividito

+0

それは削除しますが、今私は1つのバグを見つけました:例えば、私はアイテム(1、2、3) "2"を削除すると "2"が削除されますが、 "3"は削除されますが、 "3"が削除されるとアプリケーションがクラッシュします – Deividito

+0

何が起こっているのか分かりません:D – Deividito

関連する問題