Это потому, что вы пытаетесь изменить схему существующей базы данных, не сообщая ей никакой информации о миграции. Таким образом, в основном он пытается записать новую схему базы данных в существующую БД, которая не работает.
Есть два способа обойти это. Если вы находитесь в своей среде разработки, вы можете вернуться к деструктивной миграции, для этого ваш код создания базы данных будет выглядеть примерно так:
MyDatabase myDatabase = Room.databaseBuilder(context, MyDatabase.class, "my-db")
.fallbackToDestructiveMigration()
.build();
Это означает, что когда вы предоставляете базе данных обновленный или новый объект, она будет делать то, что сказал ответ @huw, и просто удаляет базу данных при установке приложения, удаляя из нее все данные, и дает вам новую установку.
Другой метод заключается в использовании функции миграции. Они довольно длинные, поэтому, если кто-то не хочет, чтобы я написал это здесь, я пока оставлю это, но в основном документацию можно найти здесь:
Документация по миграции БД Room
По сути, это заставляет БД запускать некоторый SQL, предоставленный вами, для обновления базы данных до новой версии. Таким образом, вы можете гарантировать, что ни одна из ваших данных не будет потеряна во время миграции; или как можно меньше в зависимости от того, что вы делаете. Это предпочтительный метод для рабочих приложений, поскольку он означает, что пользователи не потеряют свои ранее существовавшие данные, и вы не получите много гневных отзывов/потерянных клиентов.
Надеюсь, это поможет!
person
James Lendrem
schedule
07.09.2017