Как отменить удаление, выполненное с помощью постоянной библиотеки Room? - PullRequest
0 голосов
/ 25 сентября 2019

Я не уверен, что это квалифицированный вопрос.

Я использую функцию снэк-бара, чтобы отменить удаление, и я действительно запутался, как это сделать.Я использую библиотеку комнат, и после удаления идентификатор, связанный с моими данными, также удаляется, поэтому я не могу обратиться к удаленному идентификатору, чтобы вставить данные с этим конкретным идентификатором.Когда я нажимаю кнопку отмены, я хочу, чтобы мои данные снова были восстановлены в прежнее положение, а не как новая вставка.

Исправьте меня, если это вообще невозможно, или предоставьте какие-либо альтернативы.Thankyou

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Один из способов сделать это - использовать технику Soft-Delete.

Добавить новый столбец и назвать его, например, флагом со значением по умолчанию 0

Затем, если он удален, установить флагдля столбца 1

, и запрос будет получать результаты только там, где flag = 0

, а для удаления вы можете просто установить флаг обратно в 1

1 голос
/ 25 сентября 2019

Я рекомендую вам следовать предложению йогурта (Комментарий).Потому что, если вы удалите его из базы данных, а затем снова вставите его, вам придется извлечь весь список и дважды обновить recyclerView.Таким образом, его предложенная техника лучше для производительности.Я помогу вам реализовать это.Прежде всего, я бы посоветовал вам поддерживать класс abstract BaseAdapter, который является необязательным, поскольку вы можете реализовать его непосредственно в вашем RecyclerAdapter.

BaseAdapter

public abstract class BaseAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
   private List<T> mList = new ArrayList<>();

    @Override
    public int getItemCount() {
        return mList.size();
    }

    public T remove(int position) {
        if (position < getItemCount() && position>= 0) {
            T item = mList.remove(position);
            notifyItemRemoved(position);
            return item;
        }
        return null;
    }

    public void add(T item, int position) {
        mList.add(position, item);
        notifyItemInserted(position);
    }

    public void addAll(List<T> items) {
        mList.addAll(items);
        notifyDataSetChanged();
    }

    public void reload(List<T> items) {
        mList.clear();
        addAll(items);
    }
}

Теперь вам нужно вызвать следующий метод deleteItem(), чтобы временно удалить только из recyclerView и полностью удалить, когда истекло время ожидания.

private void deleteItem(View view, final int position) {
        final YourEntity item = adapter.remove(position);
        final Snackbar snackbar = Snackbar.make(view, item.getName() + " is Deleted", Snackbar.LENGTH_LONG);
        snackbar.setAction("Undo", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                adapter.add(item, position);
            }
        });
        snackbar.addCallback(new Snackbar.Callback() {
            @Override
            public void onDismissed(Snackbar transientBottomBar, int event) {
                if (event == DISMISS_EVENT_TIMEOUT) {
                    // TODO delete from the database
                }
            }
        });
        snackbar.show();
}
0 голосов
/ 25 сентября 2019

Вы можете сохранить Id, прежде чем удалить его, чтобы сослаться на него позже в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...