Use WAL on every device

This commit is contained in:
AntsyLich
2026-10-07 19:59:51 +06:00
parent 6490c41e63
commit 61cd786e7f
@@ -14,7 +14,6 @@ import com.eygraber.sqldelight.androidx.driver.AndroidxSqliteConnectionFactory
import com.eygraber.sqldelight.androidx.driver.AndroidxSqliteDatabaseType
import com.eygraber.sqldelight.androidx.driver.AndroidxSqliteDriver
import com.eygraber.sqldelight.androidx.driver.FileProvider
import com.eygraber.sqldelight.androidx.driver.SqliteJournalMode
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.BindingContainer
import dev.zacsweers.metro.ContributesTo
@@ -26,13 +25,13 @@ import dev.zacsweers.metro.SingleIn
object DatabaseBindings {
/**
* Configured like Room's connection manager: WAL unless the device is low on RAM, one writer with four
* readers (one in TRUNCATE mode), and a busy timeout on every connection.
* WAL on every device, so a write never blocks reads. Low-RAM devices get one reader instead of four, since each
* connection keeps its own page cache.
*/
@Provides
@SingleIn(AppScope::class)
fun providesSqlDriver(context: Context): SqlDriver {
val isWal = context.getSystemService<ActivityManager>()?.isLowRamDevice ?: true
val isLowRam = context.getSystemService<ActivityManager>()?.isLowRamDevice == true
return AndroidxSqliteDriver(
connectionFactory = object : AndroidxSqliteConnectionFactory {
override val driver: SQLiteDriver = BundledSQLiteDriver()
@@ -47,8 +46,7 @@ object DatabaseBindings {
schema = Database.Schema,
configuration = AndroidxSqliteConfiguration(
isForeignKeyConstraintsEnabled = true,
journalMode = if (isWal) SqliteJournalMode.WAL else SqliteJournalMode.Truncate,
concurrencyModel = MultipleReadersSingleWriter(isWal = isWal, nonWalCount = 1, walCount = 4),
concurrencyModel = MultipleReadersSingleWriter(isWal = true, walCount = if (isLowRam) 1 else 4),
),
)
}