У меня была аналогичная проблема. Проблема с передачей позиции в ваш оператор SQLite DELETE заключается в том, что индекс позиции элемента всегда изменяется, пока ваш идентификатор базы данных остается прежним.
Вместо того чтобы полагаться на идентификатор строки (при условии, что это ваш первичный ключ с автоматическим добавлением), чтобы соответствовать позиции, которую вы проходите, вы должны создать другой столбец в своей таблице; назовем его item_index. Каждый раз, когда вы создаете новую строку в своей базе данных, вы должны сначала установить значение item_index (integer) на размер вашего ArrayList (например, тот, который вы используете для раздувания вашего recyclerview), это сделает item_index первой строки = 0, второй = 1, третий = 2 и т. Д.
//EXAMPLE:
YourDataBaseHelper yourDataBaseHelper = new YourDataBaseHelper(/*proper parameters*/);//your database Class object
YourData yourData = new YourData(); //your setters and getters Class object
ArrayList<YourData> yourDataCounter = yourDataBaseHelper.getItems();//yourDataBaseHelper.whatever method you use to populate your ArrayList
yourData.set_itemIndex(yourDataCounter.size());
yourDataBaseHelper.addRow(yourData);//whatever method you use to insert rows
Теперь у нас все еще есть проблема с item_index и значением позиции, которое передается не соответствующим. Вы можете решить эту проблему, перейдя в свой класс dataBaseHelper и в методе DeleteItem вы можете сделать следующее:
public void deleteItem(int position){
SQLiteDatabase db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_PLACE + " WHERE " +
ITEM_INDEX + " = " + position + ";");
db.execSQL("UPDATE " + TABLE_PLACE + " SET " + ITEM_INDEX + " = " +
ITEM_INDEX + " -1 " + " WHERE " + ITEM_INDEX + " > " + position + ";");
db.close();
}
Оператор UPDATE важна, поскольку она гарантирует, что значение ITEM_INDEX всегда соответствует вашей позиции recyclerview просто путем вычитания 1 по все значения в столбце item_index, которые больше, чем значение переданной позиции.
Все это может быть стартовало в вашем классе адаптера в методе, называемом itemRemoved, который можно назвать методом OnClick:
private ArrayList<YourData> yourData = new ArrayList<>();
private Context context;
public YourAdapter(ArrayList<YourData> yourData, Context context) {
this.yourData = yourData;
this.context = context;
}
public void itemRemoved(int position) {
YourDataBaseHelper yourDataBaseHelper = new YourDataBaseHelper(/*proper parameters*/);
yourData.remove(position);
notifyItemRemoved(position);
yourDataBaseHelper.deleteItem(position);
}
Я надеюсь, что это помогло.
И вот в чем вопрос? –
i dont now, какой код для записи в onItemRemoved для удаления из db – Aron
я называю db в onItemRemoved и ничего apen – Aron