【问题标题】:SQLite Database item comes back after restarting Activity even though it was deletedSQLite 数据库项目在重新启动 Activity 后返回,即使它已被删除
【发布时间】:2018-12-29 16:04:24
【问题描述】:

从列表视图中删除该项目时,该项目会被删除,但在返回活动时,该项目会重新出现。 这是我的 Main2Activity 代码:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
position = intent.getIntExtra("position", 0);
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,  listItem);
    listView.setAdapter(adapter);
viewData1();
 listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, final int pos, long id) {


            final int itemToDelete = pos;

            new AlertDialog.Builder(Main2Activity.this)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .setTitle("Are you sure?")
                    .setMessage("Do you want to delete this location?")
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    listItem.remove(itemToDelete);
                                    databaseHelper1.deleteLocation(itemToDelete, position);


                                adapter.notifyDataSetChanged();

                                }


                            }
                    )
                    .setNegativeButton("No", null)
                    .show();

            return true;
        }

    });
}

private void viewData1() {

    Cursor cursor = databaseHelper1.viewData1(position);

    if (cursor.getCount() == 0) {

        Toast.makeText(this, "No data to show", Toast.LENGTH_SHORT).show();
    } else {
        while (cursor.moveToNext()) {
            Log.i("message", "Data got");

            listItem.add(cursor.getString(1));
        }

        adapter.notifyDataSetChanged();
    }
}

数据库助手:

public void deleteLocation(int itemToDelete,int position)
{
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();

    String itemDelete = Integer.toString(itemToDelete);

    Log.i("itemdel",itemDelete);

    if(position ==0)
    {
        String Id = (ID1);
        Log.i("Id",Id);
        String query =  " Delete from "+DB_TABLE1 + " where "+ Id + " = " + itemDelete;
        sqLiteDatabase.execSQL(query);
        sqLiteDatabase.delete(DB_TABLE1,ID1 + " = "+ itemDelete, null);
        sqLiteDatabase.compileStatement(query);

        Log.i("del"," executed")

    }

}

public Cursor viewData1(int position)
{
    SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
    Cursor cursor = null;

    if (position ==0)
    {

        String query = "Select * from " + DB_TABLE1;
        cursor = sqLiteDatabase.rawQuery(query, null);
    }
return cursor;
}

会发生什么: 删除前:

删除花园后:

关于重启活动:

如何将删除提交到数据库?谢谢。

【问题讨论】:

  • 如果只有位置 0 if(position ==0),您正在执行数据库删除操作。这是那个问题。
  • 'pos' 表示将被删除的位置,而 'position' 是我的活动意图编号。 @RakeshKumar
  • @Navdik,是的,它将被删除,因为您从以前的 activity 得到它。但是Sqlite 查询只有在position=0 时才会执行操作。检查您在Log 中的位置。如果不为 0,则不会从 db 中删除。
  • 我已经指定了 'position=0' 条件,因为它是 Main2Activity 独有的。其他活动也有其独特的“位置”。另一方面,“pos”是长按的项目。如果单击该项目,它将仅在我仍在该活动中的期间删除,而不管“位置”@RakeshKumar
  • 试试这个查询sqLiteDatabase.delete(yourTableName, "yourColumnName" + "=?",new String[]{value});

标签: android sqlite android-activity


【解决方案1】:

您的问题是您假设位置(传递给 onItemLongClick 方法的第三个参数)与行的 id 直接相关。

您不能依赖位置和 id 之间的相关性。

列表中的第一个位置将位于位置 0。分配的最低 ID(除非强制)将是 1。但是添加 1 不是解决方案,即使它最初可能有效。一旦您删除了列表中除最后一项之外的任何内容,那么 id 就会从 id 列表中省略,您不能删除一行,也可以删除其他行。

最明智/最简单的解决方法是使用 CursorAdapter 即 SimpleCursorAdapter 在这种情况下 onItemClickonItemLongClick 的第四个参数(长 l)将是实际的 id。但是,要使用 CursorAdapter,您必须将 id 列命名为 _id(因此存在常量 BaseColumns._ID)。

使用 AS 提取列时,您始终可以重命名列,例如SELECT rowid AS _id, * FROM the_table;(将选择所有现有列和 id 列)。

这是一个更全面的答案的链接,其中包含其他适配器的选项Deleting item from ListView and Database with OnItemClickListener

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2010-10-13
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多