Android Can';尝试从表/列表中删除项目时,请不要将SQLite行ID与ListView位置匹配

Android Can';尝试从表/列表中删除项目时,请不要将SQLite行ID与ListView位置匹配,android,listview,android-sqlite,Android,Listview,Android Sqlite,以前有人问过这个问题,但到目前为止,没有一个实现对我有帮助 我正在构建一个待办事项应用程序,并在listview中显示我的项目,使用SQLite进行持久化。我能够动态地将项目添加到我的listview并成功地将它们存储在我的数据库中,但我无法从屏幕或表中删除它们。我知道原因。我的SQLite行ID与我的ListView不匹配。但另一个问题是,我应该仍然能够删除屏幕上的项目和表中的位置与SQLite行ID匹配的项目(例如,我在列表中的第三个要做的事情),但我不能删除任何内容 这是我从数据库中删除项

以前有人问过这个问题,但到目前为止,没有一个实现对我有帮助

我正在构建一个待办事项应用程序,并在listview中显示我的项目,使用SQLite进行持久化。我能够动态地将项目添加到我的listview并成功地将它们存储在我的数据库中,但我无法从屏幕或表中删除它们。我知道原因。我的SQLite行ID与我的ListView不匹配。但另一个问题是,我应该仍然能够删除屏幕上的项目和表中的位置与SQLite行ID匹配的项目(例如,我在列表中的第三个要做的事情),但我不能删除任何内容

这是我从数据库中删除项目的方法:

public boolean itemDeleteFromDatabase(long id) {
        SQLiteDatabase database = databaseHelper.getWritableDatabase();
        boolean databaseDelete = database.delete(TABLE_NAME, TO_DO + "=?" + id, null) > 0;
        listItems.setAdapter(adapter);
        return databaseDelete;
    }
我从我的
onitmlongclick
方法调用此方法,将ListView位置作为参数传入:

listItems.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapter, View item, int position, long id) {
                toDoItems.remove(position);
                itemDeleteFromDatabase(id);
                MainActivity.this.adapter.notifyDataSetChanged();
                return true;
            }
        });
为每个请求添加源代码

MainActivity.java

public class MainActivity extends AppCompatActivity {
    DatabaseHelper databaseHelper;
    private final int REQUEST_CODE = 10;
    ArrayList <String> toDoItems = new ArrayList<>();
    ArrayAdapter<String> adapter;
    ListView listItems;

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

        listItems = (ListView) findViewById(R.id.listViewItems);
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, toDoItems);
        listItems.setAdapter(adapter);
        databaseHelper = new DatabaseHelper(this);
        getToDos();

        listItems.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapter, View item, int position, long id) {
                toDoItems.remove(position);
                itemDeleteFromDatabase(id + 1);
                MainActivity.this.adapter.notifyDataSetChanged();
                return true;
            }
        });

        listItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapter, View item, int pos, long id) {
                Intent intent = new Intent(MainActivity.this, EditItemActivity.class);
                intent.putExtra("item", toDoItems.get(pos));
                intent.putExtra("itemPos", String.valueOf(pos));
                startActivityForResult(intent, REQUEST_CODE);
            }
        });
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
            String item = data.getStringExtra("item");
            int itemPosition = Integer.parseInt(data.getStringExtra("itemPos"));
            toDoItems.add(itemPosition, item);
            toDoItems.remove(itemPosition + 1);
            adapter.notifyDataSetChanged();
        }
    }

    public void addItem(View v) {
        EditText newItem = (EditText) findViewById(R.id.itemInputEditText);

        if (newItem.getText().length() == 0) {
            Toast.makeText(this, "You need to enter a to do.", Toast.LENGTH_SHORT).show();
        } else {
            String item = newItem.getText().toString();
            databaseHelper.insertData(item);
            adapter.add(item);
            newItem.setText("");
        }
    }

    public  void getToDos(){
        SQLiteDatabase database = databaseHelper.getWritableDatabase();
        Cursor cursor = database.rawQuery("select * from student",null);
        if (cursor.moveToFirst()) {
            while (!cursor.isAfterLast()) {
                String name = cursor.getString(cursor.getColumnIndex("todo"));
                adapter.add(name);
                adapter.notifyDataSetChanged();
                cursor.moveToNext();
            }
        }
    }

    public boolean itemDeleteFromDatabase(Long id) {
        SQLiteDatabase database = databaseHelper.getWritableDatabase();
        boolean databaseDelete = database.delete(TABLE_NAME, TO_DO + "=?", new String[]{Long.toString(id)}) > 0;
        listItems.setAdapter(adapter);
        return databaseDelete;
    }
}

SQL基本上是说您没有提供一个参数来匹配位置
。i、 e

boolean databaseDelete = database.delete(TABLE_NAME, TO_DO + "=?" + id, null) > 0;
实际上是说
DELETE FROM table WHERE TO_DO=untablevale 10

10是用于演示的虚构id

你可以把它改成

boolean databaseDelete = database.delete(TABLE_NAME, TO_DO + "=" + id, null) > 0; 

后者可能被认为是更好的

p.S.未测试,因此可能存在奇怪的打字错误

解决方案1使用SimpleCorsorAdapter而不是ArrayAdapter 1) 在DatabaseHelper中更改公共静态最终字符串ID=“ID”将成为
公共静态最终字符串ID=“\u ID”(即添加下划线,建议您这样做,而不考虑使用的方法,但需要用于CursorAdapter)

注意!这将需要删除现有数据库。使用设置/应用程序,选择应用程序,然后清除数据或卸载应用程序。 2) 添加用0表示的行)

5) 最后,onItemLongClickListener将更改:-

    listItems.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapter, View item, int position, long id) {
            itemDeleteFromDatabase(toDoItemsID.get(position)); //<<<<<<
            toDoItems.remove(position);
            toDoItemsID.remove(position);  //<<<<<<
            //itemDeleteFromDatabase(id + 1); // REMOVE
            MainActivity.this.adapter.notifyDataSetChanged();
            return true;
        }
    });
listItems.setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView适配器、视图项、整型位置、长id){

itemDeleteFromDatabase(toDoItemsID.get(位置));//您使用的是光标适配器而不是ArrayAdapter吗?如果我回忆正确,则id将是位置。id仅在使用光标适配器时才是id。您可以在构建数组时创建一个附加数组来保存id。是的,在问题中添加适配器代码和databasehelper代码。将尝试显示选项,例如usie光标适配器和complimentary数组。现在就可以了。@OnurOzbek将看到这一点,可能错过了我所做的更改,但我怀疑这是因为我忽略了添加,我只是插入了一些测试行,而没有尝试让添加工作正常进行。
boolean databaseDelete = database.delete(TABLE_NAME, TO_DO + "=" + id, null) > 0; 
boolean databaseDelete = database.delete(TABLE_NAME, TO_DO + "=?", new String[]{Long.toString(id)}) > 0;
ArrayList<String> toDoItems = new ArrayList<>();
ArrayAdapter<String> adapter;
SimpleCursorAdapter altadapter;     //<<<<<<<<<
Cursor itemlistcursor;              //<<<<<<<<<
ListView listItems;
@Override
public void onDestroy() {
    super.onDestroy();
    itemlistcursor.close();
}
public void getItemListAsCursor() {
    SQLiteDatabase database = databaseHelper.getWritableDatabase();
    itemlistcursor = database.query(TABLE_NAME,null,null,null,null,null,null);
}
public boolean itemDeleteFromDatabase(Long id) {
    SQLiteDatabase database = databaseHelper.getWritableDatabase();
    boolean databaseDelete = database.delete(TABLE_NAME, ID + "=?", new String[]{Long.toString(id)}) > 0;
    //listItems.setAdapter(adapter);
    return databaseDelete;
}
    listItems = (ListView) findViewById(R.id.listViewItems);
    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, toDoItems);
    //listItems.setAdapter(adapter);
    databaseHelper = new DatabaseHelper(this);
    //getToDos();
    listItems.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapter, View item, int position, long id) {
            //toDoItems.remove(position);
            itemDeleteFromDatabase(id);         //<<<<<<
            getItemListAsCursor();              //<<<<<<
            //MainActivity.this.adapter.notifyDataSetChanged();
            altadapter.swapCursor(itemlistcursor);  //<<<<<<
            return true;
        }
    });
    getItemListAsCursor();
    altadapter = new SimpleCursorAdapter(this,
            android.R.layout.simple_list_item_1,
            itemlistcursor,
            new String[]{ TO_DO},
            new int[]{android.R.id.text1},
            0);
    listItems.setAdapter(altadapter);
    ArrayList <String> toDoItems = new ArrayList<>();
    ArrayList<Long> toDoItemsID = new ArrayList<>(); //<<<<<<
    ArrayAdapter<String> adapter;
    ListView listItems;
public long insertData(String todo) {
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(TO_DO, todo);
    return sqLiteDatabase.insert(TABLE_NAME, null, contentValues);
}
public  void getToDos(){
    SQLiteDatabase database = databaseHelper.getWritableDatabase();
    Cursor cursor = database.rawQuery("select * from student",null);
    if (cursor.moveToFirst()) {
        while (!cursor.isAfterLast()) {
            String name = cursor.getString(cursor.getColumnIndex(TO_DO));
            adapter.add(name);
            toDoItemsID.add(cursor.getLong(cursor.getColumnIndex(ID))); //<<<<<<
            adapter.notifyDataSetChanged();
            cursor.moveToNext();
        }
    }
}
public void addItem(View v) {
    EditText newItem = (EditText) findViewById(R.id.itemInputEditText);

    if (newItem.getText().length() == 0) {
        Toast.makeText(this, "You need to enter a to do.", Toast.LENGTH_SHORT).show();
    } else {
        String item = newItem.getText().toString();
        //databaseHelper.insertData(item);                  //OLD
        toDoItemsID.add(databaseHelper.insertData(item));   //<<<<<<<
        adapter.add(item);
        newItem.setText("");
    }
}
    listItems.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapter, View item, int position, long id) {
            itemDeleteFromDatabase(toDoItemsID.get(position)); //<<<<<<
            toDoItems.remove(position);
            toDoItemsID.remove(position);  //<<<<<<
            //itemDeleteFromDatabase(id + 1); // REMOVE
            MainActivity.this.adapter.notifyDataSetChanged();
            return true;
        }
    });