2016-05-08 7 views
0

мой SQLite удалить кодУдалить элемент из SQLite, а затем RecyclerView

public void deleteItem(int position) { 
    SQLiteDatabase db = getWritableDatabase(); 
    db.delete(TABLE_PLACE, ID + "=?" + position , null); 
} 


recyclerview

@Override 
    public void onItemRemoved(int position) { 
     places.remove(position); 
     notifyItemRemoved(position); 
     notifyDataSetChanged(); 
    } 

Как я могу удалить любую строку из SQLite базы данных, а затем удали это от RecyclerView слишком

+0

И вот в чем вопрос? –

+0

i dont now, какой код для записи в onItemRemoved для удаления из db – Aron

+0

я называю db в onItemRemoved и ничего apen – Aron

ответ

2

У меня была аналогичная проблема. Проблема с передачей позиции в ваш оператор 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); 

} 

Я надеюсь, что это помогло.

1

Вы можете попробовать этот способ:

public void deleteItem(int position) { 
    SQLiteDatabase db = getWritableDatabase(); 
    db.delete(TABLE_PLACE, ID + "=?" + position , null); 
    //you can try theese following 2 lines to delete 
    db.execSQL("DELETE FROM " + TABLE_NAME+ " WHERE "+COlUMN_NAME+"='"+value+"'"); 
    db.close(); 
    places.remove(position); 
    adapter.notifyDataSetChanged(); 
    //or like this 
    adapter.notifyItemRemoved(position); 
    } 
+0

это deleteItem в db? – Aron

+0

Сначала удалите элемент в db, затем удалите элемент из своего arraylist, а затем сообщите об этом. –

+0

как я могу назвать адаптер в db? – Aron

Смежные вопросы