Дело в том, что такое поведение является преднамеренным из-за платформы и @DatabaseView
вариантов использования аннотаций в комнатах.
Основная цель аннотации - class
. Имя по умолчанию @DatabaseView
- это имя этого класса. Комната не может запретить вам создавать классы с тем же именем, потому что это не является ее областью ответственности (и это вряд ли возможно).
Теперь давайте представим, что IF NOT EXISTS
присутствует в запросе на создание представления. У нас есть два класса с одинаковыми именами, которые определяют вид комнаты. Мы не контролируем, когда создается представление, поэтому не будем знать, какое представление будет в нашей базе данных с указанным c именем, потому что не будет никаких предупреждений относительно переопределения представления. Было бы очень подвержено ошибкам и сбивало с толку, если бы такое поведение существовало.
Мы можем определить пользовательское имя для представления, но оно может совпадать с именем класса некоторого другого представления, которое уже существует, что вызовет те же проблемы.
При создании таблицы мы имеем это IF NOT EXISTS
, потому что мы имеем полный контроль над именованием, созданием и связыванием этой таблицы с нашей базой данных. Для таблиц мы делаем это явно, а для представлений - неявно.
Помните, что Room реализует только ограниченное подмножество функций SQLite. Чтобы иметь больше контроля над тем, чего вы хотите достичь - используйте SQLite напрямую.
Я считаю, что проблемы, указанные выше в моем ответе, являются основной причиной такого поведения реализации представлений SQLite в Room. Имейте в виду, что в будущем что-то может измениться, поэтому этот ответ может быть актуален только в течение некоторого времени.
Надеюсь, это поможет.