Из таблицы SQLite достаются устаревшие данные, хотя обновление данных в таблице прошло успешно
У меня есть два фрагмента: в первом находится recycler view, во втором отображается вся информация по объекту и есть возможность его редактирования. Во втором фрагменте я делаю обновление данных в бд в методе onPause(), при первом переходе на первый фрагмент данные в recycler view не изменяются, при втором переходе на первый фрагмент данные обновляются. Не знаю с чем это связанно и как это можно исправить. Проверял с помощью логов, обновление в таблице происходит, но все равно из таблицы достается устаревшая информация.
Фрагмент с Recycler View
public class TodoFragment extends Fragment implements ToDoListAdapter.OnTodoClick {
private final String TAG = "TodoFragment";
private ImageButton addTodo;
private RecyclerView recyclerView;
private ArrayList<Todo> todoArrayList;
private Interactor interactor;
private ToDoListAdapter toDoListAdapter;
private TextView itIsTimeToAdd;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.todo_fragment, container, false);
recyclerView = view.findViewById(R.id.todo_list);
addTodo = view.findViewById(R.id.add_task);
itIsTimeToAdd = view.findViewById(R.id.time_to_add_task);
Log.d(TAG, "onCreateView");
return view;
}
@Override
public void onResume() {
super.onResume();
interactor = new Interactor(getActivity());
setOnClickListener();
init();
}
private void init(){
Log.d(TAG, "init: getting todoArrayList");
todoArrayList = interactor.getTodoList();
if(todoArrayList.size() == 0){
Random random = new Random();
int mRandomInt = random.nextInt(3);
switch (mRandomInt){
case 0:
itIsTimeToAdd.setText(R.string.offer_1);
break;
case 1:
itIsTimeToAdd.setText(R.string.offer_task);
break;
case 2:
itIsTimeToAdd.setText(R.string.offer_2);
break;
}
}
Log.d(TAG, "init: todoArrayList successfully got");
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
toDoListAdapter = new ToDoListAdapter(getContext(), todoArrayList, (ToDoListAdapter.OnTodoClick) this);
recyclerView.setAdapter(toDoListAdapter);
}
private void setOnClickListener(){
addTodo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Navigation.findNavController(getView()).navigate(R.id.todoCreationFragment);
}
});
}
@Override
public void onClick(int position) {
Todo todo = toDoListAdapter.getTodo(position);
Bundle bundle = new Bundle();
bundle.putString("TODO_ID", todo.getId());
Navigation.findNavController(getView()).navigate(R.id.todoInfoFragment, bundle);
}
}
Фрагмент обновления данных
public class TodoInfoFragment extends Fragment implements TimePickerDialog.OnTimeSetListener {
private Todo todo;
private ImageButton cancel, deleteTask;
private EditText todoEditText;
private Interactor interactor;
private ImageButton isComplete;
private TextView pickedTime, timePicker;
private Calendar calendar;
private Button deleteAlarm;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view;
view = inflater.inflate(R.layout.todo_edit_mode, container, false);
cancel = view.findViewById(R.id.todo_edit_fragment_cancel_button);
todoEditText = view.findViewById(R.id.todo_edit_fragment_edit_text_view);
deleteTask = view.findViewById(R.id.todo_info_fragment_delete_button);
isComplete = view.findViewById(R.id.todo_complete_button);
pickedTime = view.findViewById(R.id.todo_info_picked_time);
timePicker = view.findViewById(R.id.todo_info_time_picker);
deleteAlarm = view.findViewById(R.id.todo_info_cancel_alarm);
return view;
}
@Override
public void onStart() {
super.onStart();
String todoID = getArguments().getString("TODO_ID");
interactor = new Interactor(getActivity());
this.todo = interactor.getTodo(todoID);
todoEditText.setText(todo.getText());
if(todo.getIsComplete() == 1){
isComplete.setImageResource(R.drawable.ic_check_box_ticked);
}
if(todo.getReminderTime() != null){
pickedTime.setText(todo.getReminderTime());
}
setOnClickListeners();
}
private void setOnClickListeners() {
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Navigation.findNavController(getView()).popBackStack();
}
});
deleteTask.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new AlertDialog(todo, AlertDialog.TODO_FRAGMENT_ID, getView()).show(getActivity().getSupportFragmentManager(), "ALERT_DIALOG");
}
});
isComplete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (todo.getIsComplete()){
case 0:
todo.setIsComplete(1);
isComplete.setImageResource(R.drawable.ic_check_box_ticked);
break;
case 1:
todo.setIsComplete(0);
isComplete.setImageResource(R.drawable.ic_check_box_outline);
}
interactor.updateTodoDb(todo);
}
});
timePicker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new TimePickerFragment((TimePickerDialog.OnTimeSetListener)TodoInfoFragment.this).show(getActivity().getSupportFragmentManager(), "TIME_PICKER_FRAGMENT");
}
});
deleteAlarm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pickedTime.setText("");
todo.setReminderTime("");
interactor.updateTodoDb(todo);
cancelAlarm();
}
});
}
@Override
public void onPause() {
Log.d("TodoInfoFragment", "onPause");
updateTodo();
interactor.updateTodoDb(todo);
super.onPause();
}
private void updateTodo() {
todo.setText(todoEditText.getText().toString());
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
String mHour;
String mMinute;
calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
if(hourOfDay > 9){
mHour = hourOfDay + "";
}else{
mHour = "0" + hourOfDay;
}
if (minute > 9){
mMinute = "" + minute;
}else{
mMinute = "0" + minute;
}
String time = mHour + ":" + mMinute;
pickedTime.setText(time);
todo.setReminderTime(pickedTime.getText().toString());
interactor.updateTodoDb(todo);
startAlarm(calendar, todo.getText());
}
private void startAlarm(Calendar c, String title) {
if (calendar != null) {
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(getActivity().ALARM_SERVICE);
Intent intent = new Intent(getActivity(), NotificationReceiver.class);
intent.putExtra("title", title);
intent.putExtra("id", todo.getRequestCode());
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), todo.getRequestCode(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (alarmManager != null) {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}
}
}
private void cancelAlarm() {
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(getActivity().ALARM_SERVICE);
Intent intent = new Intent(getActivity(), NotificationReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), todo.getRequestCode(), intent, 0);
if (alarmManager != null) {
alarmManager.cancel(pendingIntent);
}
}
}
Скрипт получения списка из таблицы
public static String getTodoListScript() {
return "select * from todoDatabase;";
}
Метод получения списка объектов из таблицы
public ArrayList<Todo> getTodoList() {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
Cursor cursor = db.rawQuery(SQLScripts.getTodoListScript(), null);
if (cursor.moveToFirst()) {
int idColIndex = cursor.getColumnIndex("id");
int textColIndex = cursor.getColumnIndex("todoText");
int reminderTomeColIndex = cursor.getColumnIndex("reminderTime");
int isDoneColIndex = cursor.getColumnIndex("isComplete");
int requestCodeIndex = cursor.getColumnIndex("requestCode");
ArrayList<Todo> todoArrayList = new ArrayList<>();
do {
Todo todo = new Todo(cursor.getString(idColIndex),
cursor.getString(textColIndex),
cursor.getInt(isDoneColIndex),
cursor.getString(reminderTomeColIndex),
cursor.getInt(requestCodeIndex));
todoArrayList.add(todo);
} while (cursor.moveToNext());
cursor.close();
db.close();
return todoArrayList;
} else {
cursor.close();
db.close();
return new ArrayList<>();
}
}
Метод обновления элемента таблицы
public void updateTodoDb(Todo todo) {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL(SQLScripts.updateTodoListScript(todo));
db.close();
}
Скрипт обновления элемента таблицы
public static String updateTodoListScript(Todo todo) {
String id = "\"" + todo.getId() + "\"";
String text = "\"" + todo.getText() + "\"";
String reminderTime = "\"" + todo.getReminderTime() + "\"";
int isComplete = todo.getIsComplete();
return "UPDATE todoDatabase " +
"SET todoText = " + text + ", " +
"reminderTime = " + reminderTime + ", " +
"isComplete = " + isComplete + ", " +
"requestCode = " + todo.getRequestCode() + " " +
"WHERE id = " + id + ";";
Код адаптера
public class ToDoListAdapter extends
RecyclerView.Adapter<ToDoListAdapter.ToDoListViewHolder> {
String TAG = "ToDoListAdapter";
Context context;
ArrayList<Todo> todoArrayList;
OnTodoClick onTodoClick;
public ToDoListAdapter(Context context, ArrayList<Todo>
todoArrayList, OnTodoClick onTodoClick) {
this.context = context;
this.todoArrayList = todoArrayList;
this.onTodoClick = onTodoClick;
}
public void addObjToArray(Todo todo) {
Log.d(TAG, "addObjToArray: object added");
todoArrayList.add(todo);
notifyDataSetChanged();
}
public Todo getTodo(int position){
return todoArrayList.get(position);
}
@NonNull
@Override
public ToDoListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.todo_list_item, parent, false);
return new ToDoListViewHolder(view, onTodoClick);
}
@Override
public void onBindViewHolder(@NonNull ToDoListViewHolder holder, int position) {
final Todo todo = todoArrayList.get(position);
holder.bind(todo);
}
@Override
public int getItemCount() {
return todoArrayList.size();
}
class ToDoListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView todoText;
private View color;
private OnTodoClick onTodoClick;
public ToDoListViewHolder(@NonNull View itemView, OnTodoClick onTodoClick) {
super(itemView);
todoText = itemView.findViewById(R.id.todo_text);
color = itemView.findViewById(R.id.todo_color_flag);
this.onTodoClick = onTodoClick;
itemView.setOnClickListener(this);
todoText.setOnClickListener(this);
}
void bind(final Todo todo) {
todoText.setText(todo.getText());
switch (todo.getIsComplete()){
case 0:
color.setBackgroundResource(R.color.colorMaterialRed);
break;
case 1:
color.setBackgroundResource(R.color.colorMaterialGreen);
}
}
@Override
public void onClick(View v) {
onTodoClick.onClick(getAdapterPosition());
}
}
public interface OnTodoClick {
void onClick(int position);
}
}