This is the way SQLite has always worked, and it is by design. If you request to open a database read/write but the database file itself is read-only, then SQLite falls back to a read-only open. Most applications prefer it that way. If it is important to you to know that the database is writable after you open it, then you can start a transaction and ask if the database is writable using [sqlite3_db_readonly()][1] interface. [1]: https://sqlite.org/c3ref/db_readonly.html