SQLite Extensions - Android Example
October 3, 2025 ยท View on GitHub
An Android application demonstrating how to load and use multiple SQLite extensions from AAR packages.
What This Example Does
This app demonstrates loading SQLite AI extensions in an Android application:
- sqlite-vector - Vector similarity search capabilities
- sqlite-js - JavaScript execution within SQLite queries
- sqlite-sync - Cloud synchronization for SQLite databases
- sqlite-ai - AI/ML functionality within SQLite
The app (MainActivity.java:38-61) loads these extensions dynamically, opens a SQLite database, and verifies each extension by calling its version function (e.g., vector_version(), js_version()).
Package Repositories
This project uses dependencies from two package repositories:
Important: Requery SQLite Required
To load SQLite extensions on Android, you must use the requery/sqlite-android library instead of the standard Android SQLite implementation. The default Android SQLite framework does not support loading custom extensions at runtime.
Requery's sqlite-android provides:
- Full SQLite C API access through JNI
- Support for
sqlite3_load_extension()to dynamically load custom extensions - Compatible API with standard Android SQLite classes
This library is available on JitPack (see below).
Maven Central
Maven Central is the default repository for Java/Android libraries. SQLite AI extensions are published here:
Gradle (Groovy):
dependencies {
implementation 'ai.sqlite:vector:0.9.34'
implementation 'ai.sqlite:js:1.1.12'
implementation 'ai.sqlite:sync:0.8.41'
implementation 'ai.sqlite:ai:0.7.55'
}
Kotlin Gradle (build.gradle.kts):
dependencies {
implementation("ai.sqlite:vector:0.9.34")
implementation("ai.sqlite:js:1.1.12")
implementation("ai.sqlite:sync:0.8.41")
implementation("ai.sqlite:ai:0.7.55")
}
Browse packages: ai.sqlite on Maven Central
JitPack
JitPack builds Maven/Gradle packages directly from GitHub repositories. You can use JitPack for both the SQLite Android library and the SQLite AI extensions:
SQLite Android Library:
Gradle (Groovy):
repositories {
maven { url 'https://jitpack.io' }
}
dependencies {
implementation 'com.github.requery:sqlite-android:3.49.0'
}
Kotlin Gradle (build.gradle.kts):
repositories {
maven { url = uri("https://jitpack.io") }
}
dependencies {
implementation("com.github.requery:sqlite-android:3.49.0")
}
Browse package: requery/sqlite-android on JitPack
SQLite AI Extensions (Alternative to Maven Central):
Gradle (Groovy):
repositories {
maven { url 'https://jitpack.io' }
}
dependencies {
implementation 'com.github.sqliteai:sqlite-vector:0.9.32'
implementation 'com.github.sqliteai:sqlite-js:1.1.12'
implementation 'com.github.sqliteai:sqlite-sync:0.8.41'
implementation 'com.github.sqliteai:sqlite-ai:0.7.55'
}
Kotlin Gradle (build.gradle.kts):
repositories {
maven { url = uri("https://jitpack.io") }
}
dependencies {
implementation("com.github.sqliteai:sqlite-vector:0.9.32")
implementation("com.github.sqliteai:sqlite-js:1.1.12")
implementation("com.github.sqliteai:sqlite-sync:0.8.41")
implementation("com.github.sqliteai:sqlite-ai:0.7.55")
}
Critical Android Configuration
android:extractNativeLibs="true"
This flag in AndroidManifest.xml:6 is required for loading SQLite extensions:
<application
android:extractNativeLibs="true"
...>
Why it's needed:
- SQLite extensions are compiled as native
.so(shared object) libraries - By default, Android API 23+ uses
extractNativeLibs="false"to save space by running libraries directly from the APK - However, SQLite's
sqlite3_load_extension()requires a file path to load extensions - Setting
extractNativeLibs="true"extracts.sofiles to the device filesystem (nativeLibraryDir), making them accessible via file path - The app then loads extensions using paths like:
getApplicationInfo().nativeLibraryDir + "/vector"(seeMainActivity.java:27)
Without this flag, extension loading will fail with "file not found" errors.
Setup
- Import project in Android Studio
- Sync Gradle dependencies
- Run on device/emulator (requires Android API 26+)