Please can someone confirm whether all the Android SQLite best practices also apply to SQLCipher on Android?
Hi @marcardar,
That recommendation link appears inline with usage for SQLCipher. In relation to SQLCipher specifically, we often recommend the following [1] for performance as there are some perf-related usage differences between SQLite and SQLCipher.
Thanks Nick. On that page, the only sqlcipher-specific optimizations seem to be:
PRAGMA cipher_memory_security = OFF
cipher_profile
The first one comes out of the box with 4.5.0+ so is not an issue if using the latest version (unless it’s an issue with sqlcipher dbs created with earlier versions?).
The second one seems like a query optimization approach.
Is there anything else regarding configuration parameters? For example, I noticed the android dev doc recommends using PRAGMA synchronous = NORMAL
, whereas I remember Room defaulted to FULL
.
Hi @marcardar,
In particular to SQLCipher is our recommendation to not repeatedly open/close connections. This is commonly the top issue identified for users migrating from SQLite to SQLCipher due to the key derivation process.
Thanks Nick. So regarding synchronous
I can just defer to the Android dev docs?
Hey @marcardar - The appropriate PRAGMA synchronous
setting depends on the journal mode. NORMAL
is generally considered safe with WAL mode, but if you are not using WAL then we recommend FULL
.
Also, somewhat related, it’s worth noting that apple file systems may not actually flush on fsync. For the highest integrity, you would use PRAGMA synchronous = FULL;
and PRAGMA fullfsync = ON;
, but that will likely affect performance.