Skip to main content

February 17th, 2026

The Local DB Question: Which Database Powers Our Native Services? Today we performed a deep architectural analysis to decide which local database will power the offline-first features of CommitT: app blocking, pestering alarms, and task mirroring.

The Requirements

Before comparing databases, we defined exactly what we need:

The Hidden Constraint: Native Android Access

App Blocking and Alarms don’t run in React Native. They run as native Android services written in Java/Kotlin.
This is the critical insight most comparisons miss. Three separate processes need to read the same database:

Elimination Round

Initial Comparison

Eliminated

Finalists: expo-sqlite vs OP-SQLite

Winner: expo-sqlite. The 2x speed difference of OP-SQLite is irrelevant because the Accessibility Service reads from native android.database.sqlite anyway, which is the same speed regardless of which RN wrapper is used.

Long-Term Feature Map

Every future feature we’ve planned maps cleanly onto SQLite:

Hybrid Strategy: MMKV + SQLite

We will use a clean split:

Proposed SQLite Schema


Final Verdict

expo-sqlite is the clear winner. It satisfies every requirement, works natively with Android services, is maintained by the Expo team, and gives us full SQL power with JSON column support for nested data.