使用SQLite从列表视图中删除项目

我在从列表视图的数据库中删除项目时遇到问题。这是我从助手中删除数据的代码:

    {
        SQLiteDatabase db = this.getwritabledatabase();
        String query = "DELETE FROM " + DB_TABLE + " WHERE " + COL1 + " = '" + id +"'" + " AND "
                + COL2 + " = '" + name +"'";
        db.execSQL(query);
    }

它使用此代码查看数据

 private void viewData() {
        Cursor cursor = bh.viewData();

        if (cursor.getcount() == 0) {
            Toast.makeText(this,"Nothing to show",Toast.LENGTH_SHORT).show();
        } else {
            while (cursor.moveToNext()) {
                listItem.add(cursor.getString(1));
            }
            adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,listItem);
            lv.setadapter(adapter);
        }

但是问题是我不知道如何从数据库中删除它

            @Override
            public void onItemClick(AdapterView<?> adapterView,View view,int i,long l) {

                //It supposed to be deleted

            }
        });

提前谢谢

jianjunliqi 回答:使用SQLite从列表视图中删除项目

简而言之,您正在预装一个列表,该列表是从数据库中提取的单个字符串。

您的删除需要两个值。 id 名称(列出的值)。这两个值都无法从列出的单个字符串中获得。

如果COL2是唯一的(即永远不会使用相同的值),则可以基于此值轻松删除,但名称经常不是唯一的,在这种情况下,将无法从名称中得出ID。您可能必须使用对象的ArrayList(这样的对象同时包含ID和名称),或者具有另一个包含ID的数组,该ID与名称数组同步。

我建议使用CursorAdapter:-

  • 迎合游标,最特别地提供 id 作为onItemClick的第四个参数(对于其他适配器,它与第三个参数相同,即position)。
    • 注意 id 列必须命名为 _id
  • 已将游标中的所有行用作源。
  • 在调用onItemClick(以及onItemLongClick)时,光标是否处于适当的位置。

示例

以下是基于您的代码的示例。

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb";
    public static final int DBVERSION = 1;
    public static final String DB_TABLE = "mytable";
    public static final String COL1 = BaseColumns._ID; //<<<<<<<<<IMPORTANT uses the _id column
    public static final String COL2 = "mynamecolumn";


    public DatabaseHelper(@Nullable Context context) {
        super(context,DBNAME,null,DBVERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS " + DB_TABLE +
                "(" +
                COL1 + " INTEGER PRIMARY KEY," +
                COL2 + " TEXT " +
                ")"
        );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) {

    }

    public long insert(String name) {
        ContentValues cv = new ContentValues();
        cv.put(COL2,name);
        return this.getWritableDatabase().insert(DB_TABLE,cv);
    }

    public int delete(long id) {
        SQLiteDatabase db = this.getWritableDatabase();
        // ID WILL BE UNIQUE so that's enough to IDentify a row
        return db.delete(DB_TABLE,COL1 + "=?",new String[]{String.valueOf(id)});
    }

    public Cursor viewData() {
        SQLiteDatabase db = this.getWritableDatabase();
        return db.query(DB_TABLE,null);
    }
}
  • 上面的内容应与您的类似,请注意名称 _id (通过常量 BaseColumns._ID 获得) (对于COL1)。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    DatabaseHelper bh;
    Cursor csr;
    ListView lv;
    SimpleCursorAdapter adapter;

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

        lv = this.findViewById(R.id.myListView);
        bh = new DatabaseHelper(this);
        addSomeDataIfNone(); //<<<<< Add some testing data
        manageListView(); //<<<<< Manage the LIstView
    }

    private void manageListView() {
        csr = bh.viewData();
        if (adapter == null) {
            adapter = new SimpleCursorAdapter(
                    this,android.R.layout.simple_list_item_1,csr,new String[]{DatabaseHelper.COL2},new int[]{android.R.id.text1},0
            );
            lv.setAdapter(adapter);
            lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent,View view,int position,long id) {
                    bh.delete(id); //<<<<< uses the 4th parameter 
                    manageListView(); //<<<<< refresh the ListView as the data has changed
                }
            });
        } else {
            adapter.swapCursor(csr);
        }
    }

    private void addSomeDataIfNone() {
        if(DatabaseUtils.queryNumEntries(bh.getWritableDatabase(),DatabaseHelper.DB_TABLE) > 0) return;
        bh.insert("Name 1");
        bh.insert("Name 2");
        bh.insert("Name 3");
    }

    @Override
    protected void onDestroy() {
        csr.close(); // Done with the Cursor so close it
        bh.close(); // Done with the Database as this is the Main Activity
        super.onDestroy();

    }
}

请注意,这与

非常相似
  • 使用 SimpleCursorAdapter 作为ListView的源。 iself使用游标作为数据源。
  • 每次查看数据都不会创建新的适配器
  • 单击某项并因此将其删除时,将自动刷新ListView。
  • 使用 id 删除被单击的项目,因为这是对 id 验证行唯一的全部操作。

结果

首次运行时:-

enter image description here

单击名称2时:-

enter image description here

本文链接:https://www.f2er.com/3114608.html

大家都在问