Jacky
08/23/2023, 12:14 PMfile is encrypted or is not a database
error. The outdated library itself uses outdated SqlCipher
version. Thanks.eygraber
08/23/2023, 4:14 PMJacky
09/29/2023, 4:03 PMeygraber
10/02/2023, 7:21 AMprivate val configuration = SupportSQLiteOpenHelper
.Configuration
.builder(context)
.callback(
object : AndroidSqliteDriver.Callback(MyDatabase.Schema) {
override fun onConfigure(db: SupportSQLiteDatabase) {
super.onConfigure(db)
db.enableWriteAheadLogging()
// set it to false so migrations don't have to worry about it
// we'll set it to true in onOpen
db.setForeignKeyConstraintsEnabled(false)
}
override fun onOpen(db: SupportSQLiteDatabase) {
super.onOpen(db)
db.setForeignKeyConstraintsEnabled(true)
}
}
)
.name(MyDatabaseHelper.DATABASE_NAME)
.build()
private val standardHelper = object : net.sqlcipher.database.SQLiteOpenHelper(
configuration.context,
configuration.name,
null,
configuration.callback.version,
null
) {
override fun onCreate(db: SQLiteDatabase) {
configuration.callback.onCreate(db)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
configuration.callback.onUpgrade(db, oldVersion, newVersion)
}
override fun onDowngrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
configuration.callback.onDowngrade(db, oldVersion, newVersion)
}
override fun onOpen(db: SQLiteDatabase) {
configuration.callback.onOpen(db)
}
override fun onConfigure(db: SQLiteDatabase) {
configuration.callback.onConfigure(db)
}
}
init {
SQLiteDatabase.loadLibs(configuration.context)
}
private var isPassphraseCleared = false
private val passphrase = ...
override val databaseName: String? = standardHelper.databaseName
override fun setWriteAheadLoggingEnabled(enabled: Boolean) {
standardHelper.setWriteAheadLoggingEnabled(enabled)
}
override val writableDatabase: SupportSQLiteDatabase = try {
standardHelper.getWritableDatabase(passphrase).also {
if(!isPassphraseCleared) {
passphrase.fill(0.toByte())
isPassphraseCleared = true
}
}
}
catch(ex: SQLiteException) {
// we have some custom handling here
throw ex
}
override val readableDatabase: SupportSQLiteDatabase = writableDatabase
override fun close() {
standardHelper.close()
}
}
app.cash.sqldelight.driver.android.AndroidSqliteDriver(standardHelper)
Some of that might be a little extra because I pulled this out of our DI glue, but that's the basic idea.
passphrase
is a ByteArray