Fixed
Status Update
Comments
da...@google.com <da...@google.com>
da...@google.com <da...@google.com>
ap...@google.com <ap...@google.com> #2
So, the view is something we added recently. It appears that
- removing the view entirely, the destructive migration works. But it doesn't actually remove the view.
- adding the view back in, the destructive migration fails with the same message.
It appears that the destructive migration is not dropping the view, but it does try to create it again, which is what blows up.
I was able to work around this by adding a RoomCallback
and overriding the onDestructiveMigration callback to manually delete the view:
override fun onDestructiveMigration(connection: SQLiteConnection) {
super.onDestructiveMigration(connection)
connection.execSQL("DROP VIEW IF EXISTS calendar_items_view")
}
This is a pretty big potential footgun for anyone using views with destructive migrations!
da...@google.com <da...@google.com>
na...@google.com <na...@google.com> #3
This sounds like a bug, with destructive migrations turned ON, views should also be recreated and it seems they are not being dropped before being created again leading to the 'already exists' issue.
Description
Component used: room
Version used: 2.7.0-alpha11
Devices/Android versions reproduced on: Android 11
I was porting our code over to the new AndroidSQLiteDriver. We previously pass in a database name of "data.db", like so:
Room.databaseBuilder(context, AppDatabase::class.java, "data.db")
With the new AndroidSQLiteDriver, it appears it requires an absolute path for the file. It doesn't give a clear error message about this however - it just says something about a read-only filesystem, (presumably it's resolving the filename against a read-only folder, instead of my app's database folder). Can you handle this case to give a clearer error message?
I was able to fix by using an absolute path like below, but it wasn't very easy to work out the problem.
Room.databaseBuilder(context, AppDatabase::class.java, context.getDatabasePath("data.db").absolutePath)