【问题标题】:Deleting an item from SQLite and listView从 SQLite 和 listView 中删除项目
【发布时间】:2016-05-02 23:22:04
【问题描述】:

我想使用 contextMenu 从 listView 和 SQLite 数据库中删除项目(按住项目并按住,删除按钮出现,按下它并删除项目)并且我的代码不会删除任何内容。我尝试按下 Delete 键时,出现带有文本的 toast 并且它起作用了。

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


}

【问题讨论】:

    标签: android sqlite listview


    【解决方案1】:

    您并未从列表books 中删除该项目。如果booksArrayList 那么 将您的代码行更改为

    books.remove(info.position);
    

    并从数据库中删除(如果书是自定义类型的 ArrayList)。

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

    如果 books 是一个字符串数组列表,那么

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

    【讨论】:

    • 我的应用程序带有保存和检索按钮(当您按下检索时,将显示所有列表)。它删除了项目,但是当再次按下 Retrieve btn 时,它又出现了,所以这意味着它没有从数据库中删除。当我尝试使用 db.delete(books.get(info.position));它是“不幸的是,图书馆已经停止了”。我编辑了我的帖子并插入了完整的代码
    • 它会删除,但现在我发现了一个错误:例如,我有 3 个要删除的项目(“1”、“2”和“3”)我在项目“1”上按删除,但它删除了项目“2”,我按删除项“2”,它会删除“3”,但如果我按删除“3”应用程序崩溃
    • 我不明白发生了什么:D
    • @Deividito 尝试在您的列表视图项目上使用长按并让弹出窗口出现。然后在弹出的创建点击删除功能。然后长按只需要这个。希望这会有所帮助
    猜你喜欢
    • 2018-09-02
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多