1

だから、私はプロジェクトに取り組んでいて、RecyclerView からアイテムを削除したいのですが、ユーザーがスナックバーで「元に戻す」を押すことでそのアイテムを復元できるようにしたいと考えています。RecyclerView アイテムは SQLite データベースからデータを取得しており、ユーザーがアイテムを削除すると、RecyclerView およびデータベース内のテーブルの対応する行からアイテムが削除されます。私の問題は、その削除されたデータ (SQLite データ) を回復する方法を理解できないように見えることです。

カーソルがアクセスする行を認識できるように、DataBaseHelper クラスでメソッドを作成しようとしました。これにより、カーソルを使用してその行のすべての値を AlarmData(私のセッターとゲッター クラス) オブジェクトに割り当て、それをアダプタ クラスに戻して、Snackbar の UNDO アクション メソッドでテーブルの行を復元できるようにします。

コードは次のとおりです。

データベースヘルパー.java

// Is public AlarmData even legal? that's my setter and getter class
// and the object type I'm trying to return

   public AlarmData recoverAlarms(int position) {

    AlarmData recoverData = new AlarmData();

    String ALARM_RESTORE_QUERY = "SELECT * FROM " + TABLE_ALARMS + " WHERE " + COLUMN_INDEX +
            " = " + position + ";";

    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor = db.rawQuery(ALARM_RESTORE_QUERY, null);

    try {
        if (cursor.moveToFirst()) {
            do {

                recoverData.set_dispLabel(cursor.getString(cursor.getColumnIndex(COLUMN_LABEL)));
                recoverData.set_dispTime(cursor.getString(cursor.getColumnIndex(COLUMN_TIME)));
                recoverData.set_alarmId(cursor.getInt(cursor.getColumnIndex(COLUMN_INDEX)));

            } while (cursor.moveToNext());
        }
    } catch (Exception e) {
        throw e;
    } finally {
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
            db.close();
        }

    }

    return recoverData;
}

AlarmAdapter.java

   public void deleteAlarm(final int position, final View view) {

    final AlarmData recoverAlarmData = new DataBaseHelper(context, null, null, 1).recoverAlarms(position); //INITIALIZES VARIABLE TO THE OBJECT THAT'S RETURNED
    final AlarmData recoverItem = alarmData.get(position); //Recovers RecyclerView item (this works)
    final DataBaseHelper dataBaseHelper = new DataBaseHelper(context, null, null, 1);


    alarmData.remove(position);
    notifyItemRemoved(position);
    dataBaseHelper.deleteAlarms(position); //DELETES TABLE'S ROW

    Snackbar snackbar = Snackbar.make(view, "Alarm Removed", Snackbar.LENGTH_LONG)
            .setAction("UNDO", new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    alarmData.add(position, recoverItem);
                    notifyItemInserted(position); //RESTORES RECYCLERVIEW ITEM

                    dataBaseHelper.addAlarm(recoverAlarmData); //TRIES TO RECOVER TABLE

                }
            });

    snackbar.show();


}

明確にするために、データベース内の特定の行のコピーを作成する方法を知りたいので、ユーザーがスナックバーで UNDO を押したときにそれを再作成できます。また、私が間違っていることを説明してください。笑..

ここで自分の愚かさをあまり見せなかったことを願っています。どうぞよろしくお願いいたします。ありがとうございました!

4

1 に答える 1