Повреждение базы данных при изменении ориентации экрана - PullRequest
0 голосов
/ 17 октября 2018

У меня есть приложение для Android, которое использует Room для работы с базой данных.В одном из фрагментов в onViewCreated я получаю объект из базы данных, используя простой запрос SELECT * FROM table WHERE id = ?.Идентификатор запроса хранится в наборе аргументов фрагмента.Это работает нормально, но когда я меняю ориентацию и фрагмент воссоздается системой, тот же запрос возвращает ноль, и я не могу получить эту запись из любого другого запроса в приложении.

Я проверил идентификатор, он делаетне исчезают после изменения ориентации, и я использовал отладчик для перехвата всех запросов к базе данных, были только запросы SELECT, без DELETE, UPDATE или INSERT

UPD: код

фрагмент

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_lesson_client, container, false);
    ButterKnife.bind(this, view);

    lesson = App.Companion.getDb().lessonDao().getLesson(getArguments().getLong("lesson"));

DAO

@Query("SELECT * FROM Lesson WHERE id == :id")
fun getLesson(id: Long): Lesson?

1 Ответ

0 голосов
/ 18 октября 2018

Хорошо, моя проблема, во-первых, в том, что в Room нет аннотации @Upsert, и я просто предположил, что @Insert(onConflict = OnConflictStrategy.REPLACE) делает то же самое, но это не так.Вместо обновления записи она фактически удаляет ее и вставляет новую.И так получилось, что в моем фрагменте было TextWatcher, подключенное к текстовому полю, которое выполняло указанную вставку в записи, на которую ссылалась эта исчезающая запись из вопроса, используя FOREIGN KEY ON DELETE CASCADE.Во время изменения ориентации TextWatcher вызвало событие, и удаление записи во время вставки фактически каскадно и удалило все записи, которые ссылались на него, что вызвало проблему

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