Android Room Create View Bug - PullRequest
       4

Android Room Create View Bug

0 голосов
/ 17 апреля 2020

Мое текущее Android приложение использует Room для своей локальной базы данных. Приложение имеет несколько таблиц и одно представление.

Проблема, с которой я сталкиваюсь, заключается в том, что иногда, когда я переустанавливаю приложение с нуля, я получаю следующее исключение: -

2020-04-17 14:20:22.568 20752-20886/org.my.application E/SQLiteLog: (1) table `myView` already exists

Я полагаю, что эта проблема вызвана Room

Например, операторы создания / удаления таблиц / индексов выглядят следующим образом: -

CREATE TABLE IF NOT EXISTS...
CREATE UNIQUE INDEX IF NOT EXISTS 
DROP TABLE IF EXISTS 

, где в качестве оператора создания представления -

CREATE VIEW `myView`

Почему не может Room генерировать оператор создания представления, который включает IF NOT EXISTS?

1 Ответ

1 голос
/ 20 апреля 2020

Дело в том, что такое поведение является преднамеренным из-за платформы и @DatabaseView вариантов использования аннотаций в комнатах.

Основная цель аннотации - class. Имя по умолчанию @DatabaseView - это имя этого класса. Комната не может запретить вам создавать классы с тем же именем, потому что это не является ее областью ответственности (и это вряд ли возможно).

Теперь давайте представим, что IF NOT EXISTS присутствует в запросе на создание представления. У нас есть два класса с одинаковыми именами, которые определяют вид комнаты. Мы не контролируем, когда создается представление, поэтому не будем знать, какое представление будет в нашей базе данных с указанным c именем, потому что не будет никаких предупреждений относительно переопределения представления. Было бы очень подвержено ошибкам и сбивало с толку, если бы такое поведение существовало.

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

При создании таблицы мы имеем это IF NOT EXISTS, потому что мы имеем полный контроль над именованием, созданием и связыванием этой таблицы с нашей базой данных. Для таблиц мы делаем это явно, а для представлений - неявно.

Помните, что Room реализует только ограниченное подмножество функций SQLite. Чтобы иметь больше контроля над тем, чего вы хотите достичь - используйте SQLite напрямую.

Я считаю, что проблемы, указанные выше в моем ответе, являются основной причиной такого поведения реализации представлений SQLite в Room. Имейте в виду, что в будущем что-то может измениться, поэтому этот ответ может быть актуален только в течение некоторого времени.

Надеюсь, это поможет.

...