Reference version

This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

Expo SQLite iconExpo SQLite

提供访问数据库功能的库,可通过 SQLite API 对数据库进行查询。

Android
iOS
macOS
tvOS
Web
Included in Expo Go
Recommended version:
~57.0.3

原文内容已经是简体中文,无需翻译。

使用 Store
// 存储 API 是默认导出,你可以将其称为 Storage、AsyncStorage,或任何你喜欢的名称。 import Storage from 'expo-sqlite/kv-store'; await Storage.setItem('key', JSON.stringify({ entity: 'value' })); const value = await Storage.getItem('key'); const entity = JSON.parse(value); console.log(entity); // { entity: 'value' }

使用 expo-sqlite/kv-store 的一大好处是增加了同步 API,使用起来更加方便:

使用带同步 API 的 Store
// 存储 API 是默认导出,你可以将其称为 Storage、AsyncStorage,或任何你喜欢的名称。 import Storage from 'expo-sqlite/kv-store'; Storage.setItemSync('key', 'value'); const value = Storage.getItemSync('key');

如果你的项目当前使用的是 @react-native-async-storage/async-storage,切换到 expo-sqlite/kv-store 只需更改导入语句:

- import AsyncStorage from '@react-native-async-storage/async-storage'; + import AsyncStorage from 'expo-sqlite/kv-store';

localStorage API

expo-sqlite/localStorage/install 模块提供了 localStorage API 的即插即用实现。如果你已经熟悉 Web 上的此 API,或者希望能够在 Web 和其他平台之间共享存储代码,那么这可能会很有用。要使用它,只需导入 expo-sqlite/localStorage/install 模块:

安装 globalThis.localStorage
import 'expo-sqlite/localStorage/install'; globalThis.localStorage.setItem('key', 'value'); console.log(globalThis.localStorage.getItem('key')); // 'value'

安全

SQL 注入是一类漏洞,攻击者会诱骗你的应用将用户输入作为 SQL 代码执行。你必须对传递给 SQLite 的所有用户输入进行转义,以防御 SQL 注入。预处理语句是防御此问题的有效方法。它们明确地将 SQL 查询的逻辑与其输入参数分离开来,并且 SQLite 在执行预处理语句时会自动对输入进行转义。

第三方库集成

expo-sqlite 库旨在提供稳健的 SQLite 基础。它支持与第三方库进行更广泛的集成,以实现更高级的功能。以下是一些可以与 expo-sqlite 一起使用的库。

Drizzle ORM

Drizzle 是一个"具有头部的无头 TypeScript ORM"。它可以在 Node.js、Bun、Deno 和 React Native 上运行。它还提供了一个名为 drizzle-kit 的 CLI 配套工具,用于生成 SQL 迁移。

如需了解更多详情,请参阅 Drizzle ORM 文档 和 expo-sqlite 集成指南。

Knex.js

Knex.js 是一个 SQL 查询构建器,"灵活、可移植且使用起来很有趣!"

如需了解更多详情,请参阅 expo-sqlite 集成指南。

SQLCipher

SQLCipher 是 SQLite 的一个分支,为数据库添加了加密和身份验证功能。expo-sqlite 库支持在 Android、iOS 和 macOS 上使用 SQLCipher。要使用 SQLCipher,您需要按照应用配置中的配置部分所示,将 useSQLCipher 配置添加到 app.json,然后运行 npx expo prebuild。

打开数据库后,需要立即使用 PRAGMA key = 'password' 语句为数据库设置密码。

为数据库添加密码
const db = await SQLite.openDatabaseAsync('databaseName'); await db.execAsync(`PRAGMA key = 'password'`);

API

常用 API 速查表

下表总结了 SQLiteDatabase 和 SQLiteStatement 类的常用 API:

SQLiteDatabase 方法SQLiteStatement 方法描述使用场景
runAsync()executeAsync()执行 SQL 查询,并返回所做更改的信息。适用于 INSERT、UPDATE、DELETE 等 SQL 写操作。
getFirstAsync()executeAsync() + getFirstAsync()获取查询结果中的第一行。适用于从数据库中获取单行数据。例如:getFirstAsync('SELECT * FROM Users WHERE id = ?', userId)。
getAllAsync()executeAsync() + getFirstAsync()一次性获取所有查询结果。最适合结果集较小的场景,例如带有 LIMIT 子句的查询:SELECT * FROM Table LIMIT 100,即需要一次性获取所有结果。
getEachAsync()executeAsync() + for-await-of 异步迭代器提供用于遍历结果集的迭代器。此方法每次从数据库中获取一行,与 getAllAsync() 相比,可能会减少内存使用量。建议用于增量处理大型结果集,例如实现无限滚动时。

Constants

SQLite.AsyncStorage

Android
iOS
macOS
tvOS
Web

Type: SQLiteStorage

This default instance of the SQLiteStorage class is used as a drop-in replacement for the AsyncStorage module from @react-native-async-storage/async-storage.

SQLite.bundledExtensions

Android
iOS
macOS
tvOS
Web

Type: Record<string, { entryPoint: string, libPath: string } | undefined>

The pre-bundled SQLite extensions.

SQLite.defaultDatabaseDirectory

Android
iOS
macOS
tvOS
Web

Type: any

The default directory for SQLite databases.

SQLite.SQLiteProvider

Android
iOS
macOS
tvOS
Web

Type: MemoExoticComponent<(__namedParameters: SQLiteProviderProps) => Element>

Context.Provider component that provides a SQLite database to all children. All descendants of this component will be able to access the database using the useSQLiteContext hook.

SQLite.Storage

Android
iOS
macOS
tvOS
Web

Type: SQLiteStorage

Alias for AsyncStorage, given the storage not only offers asynchronous methods.

Hooks

useSQLiteContext()

Android
iOS
macOS
tvOS
Web

A global hook for accessing the SQLite database across components. This hook should only be used within a <SQLiteProvider> component.

Example

export default function App() { return ( <SQLiteProvider databaseName="test.db"> <Main /> </SQLiteProvider> ); } export function Main() { const db = useSQLiteContext(); console.log('sqlite version', db.getFirstSync('SELECT sqlite_version()')); return <View /> }

Classes

SQLiteDatabase

Android
iOS
macOS
tvOS
Web

A SQLite database.

SQLiteDatabase Properties

databasePath

Android
iOS
macOS
tvOS
Web
Read only • Type: string

nativeDatabase

Android
iOS
macOS
tvOS
Web
Read only • Type: NativeDatabase

options

Android
iOS
macOS
tvOS
Web
Read only • Type: SQLiteOpenOptions

SQLiteDatabase Methods

closeAsync()

Android
iOS
macOS
tvOS
Web

Close the database.

Returns:
Promise<void>

closeSync()

Android
iOS
macOS
tvOS
Web

Close the database.

Returns:
void

createSessionAsync(dbName)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
dbName(optional)string

The name of the database to create a session for. The default value is main.

Default:'main'

Create a new session for the database.

createSessionSync(dbName)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
dbName(optional)string

The name of the database to create a session for. The default value is main.

Default:'main'

Create a new session for the database.

execAsync(source)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing all the SQL queries.


Execute all SQL queries in the supplied string.

Returns:
Promise<void>

execSync(source)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing all the SQL queries.


Execute all SQL queries in the supplied string.

Returns:
void

getAllAsync(source, params)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing the SQL query.

paramsSQLiteBindParams

The parameters to bind to the prepared statement. You can pass values in array, object, or variadic arguments. See SQLiteBindValue for more information about binding values.


A convenience wrapper around SQLiteDatabase.prepareAsync(), SQLiteStatement.executeAsync(), SQLiteExecuteAsyncResult.getAllAsync(), and SQLiteStatement.finalizeAsync().

Returns:
Promise<T[]>

Example

// For unnamed parameters, you pass values in an array. db.getAllAsync('SELECT * FROM test WHERE intValue = ? AND name = ?', [1, 'Hello']); // For unnamed parameters, you pass values in variadic arguments. db.getAllAsync('SELECT * FROM test WHERE intValue = ? AND name = ?', 1, 'Hello'); // For named parameters, you should pass values in object. db.getAllAsync('SELECT * FROM test WHERE intValue = $intValue AND name = $name', { $intValue: 1, $name: 'Hello' });

getAllSync(source, params)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing the SQL query.

paramsSQLiteBindParams

The parameters to bind to the prepared statement. You can pass values in array, object, or variadic arguments. See SQLiteBindValue for more information about binding values.


A convenience wrapper around SQLiteDatabase.prepareSync(), SQLiteStatement.executeSync(), SQLiteExecuteSyncResult.getAllSync(), and SQLiteStatement.finalizeSync().

Returns:
T[]

getEachAsync(source, params)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing the SQL query.

paramsSQLiteBindParams

The parameters to bind to the prepared statement. You can pass values in array, object, or variadic arguments. See SQLiteBindValue for more information about binding values.


A convenience wrapper around SQLiteDatabase.prepareAsync(), SQLiteStatement.executeAsync(), SQLiteExecuteAsyncResult AsyncIterator, and SQLiteStatement.finalizeAsync().

Rather than returning Promise, this function returns an AsyncIterableIterator. You can use for await...of to iterate over the rows from the SQLite query result.

getEachSync(source, params)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing the SQL query.

paramsSQLiteBindParams

The parameters to bind to the prepared statement. You can pass values in array, object, or variadic arguments. See SQLiteBindValue for more information about binding values.


A convenience wrapper around SQLiteDatabase.prepareSync(), SQLiteStatement.executeSync(), SQLiteExecuteSyncResult Iterator, and SQLiteStatement.finalizeSync().

Returns:
IterableIterator<T>

This function returns an IterableIterator. You can use for...of to iterate over the rows from the SQLite query result.

getFirstAsync(source, params)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing the SQL query.

paramsSQLiteBindParams

The parameters to bind to the prepared statement. You can pass values in array, object, or variadic arguments. See SQLiteBindValue for more information about binding values.


getFirstSync(source, params)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing the SQL query.

paramsSQLiteBindParams

The parameters to bind to the prepared statement. You can pass values in array, object, or variadic arguments. See SQLiteBindValue for more information about binding values.


A convenience wrapper around SQLiteDatabase.prepareSync(), SQLiteStatement.executeSync(), SQLiteExecuteSyncResult.getFirstSync(), and SQLiteStatement.finalizeSync().

Returns:
T | null

isInTransactionAsync()

Android
iOS
macOS
tvOS
Web

Asynchronous call to return whether the database is currently in a transaction.

Returns:
Promise<boolean>

isInTransactionSync()

Android
iOS
macOS
tvOS
Web

Synchronous call to return whether the database is currently in a transaction.

Returns:
boolean

loadExtensionAsync(libPath, entryPoint)

Android
iOS
macOS
tvOS
ParameterTypeDescription
libPathstring

The path to the extension library file.

entryPoint(optional)string

The entry point of the extension. If not provided, the default entry point is inferred by sqlite3_load_extension.


Load a SQLite extension.

Returns:
Promise<void>

Example

// Load `sqlite-vec` from `bundledExtensions`. You need to enable `withSQLiteVecExtension` to include `sqlite-vec`. const extension = SQLite.bundledExtensions['sqlite-vec']; await db.loadExtensionAsync(extension.libPath, extension.entryPoint); // You can also load a custom extension. await db.loadExtensionAsync('/path/to/extension');

loadExtensionSync(libPath, entryPoint)

Android
iOS
macOS
tvOS
ParameterTypeDescription
libPathstring

The path to the extension library file.

entryPoint(optional)string

The entry point of the extension. If not provided, the default entry point is inferred by sqlite3_load_extension.


Load a SQLite extension.

Returns:
void

Example

// Load `sqlite-vec` from `bundledExtensions`. You need to enable `withSQLiteVecExtension` to include `sqlite-vec`. const extension = SQLite.bundledExtensions['sqlite-vec']; db.loadExtensionSync(extension.libPath, extension.entryPoint); // You can also load a custom extension. db.loadExtensionSync('/path/to/extension');

prepareAsync(source)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing the SQL query.


prepareSync(source)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing the SQL query.


Create a prepared SQLite statement.

runAsync(source, params)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing the SQL query.

paramsSQLiteBindParams

The parameters to bind to the prepared statement. You can pass values in array, object, or variadic arguments. See SQLiteBindValue for more information about binding values.


runSync(source, params)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing the SQL query.

paramsSQLiteBindParams

The parameters to bind to the prepared statement. You can pass values in array, object, or variadic arguments. See SQLiteBindValue for more information about binding values.


A convenience wrapper around SQLiteDatabase.prepareSync(), SQLiteStatement.executeSync(), and SQLiteStatement.finalizeSync().

serializeAsync(databaseName)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
databaseName(optional)string

The name of the current attached databases. The default value is main which is the default database name.

Default:'main'

Serialize the database as Uint8Array.

Returns:
Promise<Uint8Array<ArrayBufferLike>>

serializeSync(databaseName)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
databaseName(optional)string

The name of the current attached databases. The default value is main which is the default database name.

Default:'main'

Serialize the database as Uint8Array.

Returns:
Uint8Array

sql(strings, ...values)

Android
iOS
macOS
tvOS
Web
ParameterType
stringsTemplateStringsArray
...valuesunknown[]

Execute SQL queries using tagged template literals (Bun-style API). Queries are automatically protected against SQL injection using prepared statements.

The query result is directly awaitable and returns an array of objects by default. Use .values(), .first(), or .each() for different result formats.

Example

// Direct await - returns array of objects const users = await sql<User>`SELECT * FROM users WHERE age > ${21}`; // Get first row only const user = await sql<User>`SELECT * FROM users WHERE id = ${userId}`.first(); // Get values as arrays const rows = await sql`SELECT name, age FROM users`.values(); // Returns: [["Alice", 30], ["Bob", 25]] // INSERT/UPDATE/DELETE - returns SQLiteRunResult const result = await sql`INSERT INTO users (name, age) VALUES (${name}, ${age})` as SQLiteRunResult; console.log('Inserted row:', result.lastInsertRowId); // Iteration for await (const user of db<User>`SELECT * FROM users`.each()) { console.log(user.name); } // Synchronous API const users = sql<User>`SELECT * FROM users WHERE age > ${21}`.allSync(); const user = sql<User>`SELECT * FROM users WHERE id = ${userId}`.firstSync();

syncLibSQL()

Android
iOS
macOS
tvOS
Web

Synchronize the local database with the remote libSQL server. This method is only available from libSQL integration.

Returns:
Promise<void>

withExclusiveTransactionAsync(task)

Android
iOS
macOS
tvOS
ParameterTypeDescription
task(txn: Transaction) => Promise<void>

An async function to execute within a transaction. Any queries inside the transaction must be executed on the txn object. The txn object has the same interfaces as the SQLiteDatabase object. You can use txn like a SQLiteDatabase object.


Execute a transaction and automatically commit/rollback based on the task result.

The transaction may be exclusive. As long as the transaction is converted into a write transaction, the other async write queries will abort with database is locked error.

Returns:
Promise<void>

Example

db.withExclusiveTransactionAsync(async (txn) => { await txn.execAsync('UPDATE test SET name = "aaa"'); });

withTransactionAsync(task)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
task() => Promise<void>

An async function to execute within a transaction.


Execute a transaction and automatically commit/rollback based on the task result.

Returns:
Promise<void>

Example

db.withTransactionAsync(async () => { await db.execAsync('UPDATE test SET name = "aaa"'); // // We cannot control the order of async/await order, so order of execution is not guaranteed. // The following UPDATE query out of transaction may be executed here and break the expectation. // const result = await db.getFirstAsync<{ name: string }>('SELECT name FROM Users'); expect(result?.name).toBe('aaa'); }); db.execAsync('UPDATE test SET name = "bbb"');

If you worry about the order of execution, use withExclusiveTransactionAsync instead.

withTransactionSync(task)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
task() => void

An async function to execute within a transaction.


Execute a transaction and automatically commit/rollback based on the task result.

Returns:
void

SQLiteSession

Android
iOS
macOS
tvOS
Web

A class that represents an instance of the SQLite session extension.

SQLiteSession Methods

applyChangesetAsync(changeset)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
changesetChangeset

The changeset to apply.


Apply a changeset asynchronously.

Returns:
Promise<void>

applyChangesetSync(changeset)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
changesetChangeset

The changeset to apply.


Apply a changeset synchronously.

Returns:
void

attachAsync(table)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
tablestring | null

The table to attach. If null, all tables are attached.


Attach a table to the session asynchronously.

Returns:
Promise<void>

attachSync(table)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
tablestring | null

The table to attach.


Attach a table to the session synchronously.

Returns:
void

closeAsync()

Android
iOS
macOS
tvOS
Web

Close the session asynchronously.

Returns:
Promise<void>

closeSync()

Android
iOS
macOS
tvOS
Web

Close the session synchronously.

Returns:
void

createChangesetAsync()

Android
iOS
macOS
tvOS
Web

Create a changeset asynchronously.

createChangesetSync()

Android
iOS
macOS
tvOS
Web

Create a changeset synchronously.

Returns:
Changeset

createInvertedChangesetAsync()

Android
iOS
macOS
tvOS
Web

Create an inverted changeset asynchronously. This is a shorthand for createChangesetAsync() + invertChangesetAsync().

createInvertedChangesetSync()

Android
iOS
macOS
tvOS
Web

Create an inverted changeset synchronously. This is a shorthand for createChangesetSync() + invertChangesetSync().

Returns:
Changeset

enableAsync(enabled)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
enabledboolean

Whether to enable or disable the session.


Enable or disable the session asynchronously.

Returns:
Promise<void>

enableSync(enabled)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
enabledboolean

Whether to enable or disable the session.


Enable or disable the session synchronously.

Returns:
void

invertChangesetAsync(changeset)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
changesetChangeset

The changeset to invert.


Invert a changeset asynchronously.

invertChangesetSync(changeset)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
changesetChangeset

The changeset to invert.


Invert a changeset synchronously.

Returns:
Changeset

SQLiteStatement

Android
iOS
macOS
tvOS
Web

A prepared statement returned by SQLiteDatabase.prepareAsync() or SQLiteDatabase.prepareSync() that can be binded with parameters and executed.

SQLiteStatement Methods

executeAsync(params)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
paramsSQLiteBindParams

The parameters to bind to the prepared statement. You can pass values in array, object, or variadic arguments. See SQLiteBindValue for more information about binding values.


Run the prepared statement and return the SQLiteExecuteAsyncResult instance.

executeSync(params)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
paramsSQLiteBindParams

The parameters to bind to the prepared statement. You can pass values in array, object, or variadic arguments. See SQLiteBindValue for more information about binding values.


Run the prepared statement and return the SQLiteExecuteSyncResult instance.

finalizeAsync()

Android
iOS
macOS
tvOS
Web

Finalize the prepared statement. This will call the sqlite3_finalize() C function under the hood.

Attempting to access a finalized statement will result in an error.

Returns:
Promise<void>

finalizeSync()

Android
iOS
macOS
tvOS
Web

Finalize the prepared statement. This will call the sqlite3_finalize() C function under the hood.

Attempting to access a finalized statement will result in an error.

Returns:
void

getColumnNamesAsync()

Android
iOS
macOS
tvOS
Web

Get the column names of the prepared statement.

Returns:
Promise<string[]>

getColumnNamesSync()

Android
iOS
macOS
tvOS
Web

Get the column names of the prepared statement.

Returns:
string[]

SQLiteStorage

Android
iOS
macOS
tvOS
Web

Key-value store backed by SQLite. This class accepts a databaseName parameter in its constructor, which is the name of the database file to use for the storage.

SQLiteStorage Methods

clear()

Android
iOS
macOS
tvOS
Web

Alias for clearAsync() method.

Returns:
Promise<void>

clearAsync()

Android
iOS
macOS
tvOS
Web

Clears all key-value pairs from the storage asynchronously.

Returns:
Promise<boolean>

clearSync()

Android
iOS
macOS
tvOS
Web

Clears all key-value pairs from the storage synchronously.

Returns:
boolean

close()

Android
iOS
macOS
tvOS
Web

Alias for closeAsync() method.

Returns:
Promise<void>

closeAsync()

Android
iOS
macOS
tvOS
Web

Closes the database connection asynchronously.

Returns:
Promise<void>

closeSync()

Android
iOS
macOS
tvOS
Web

Closes the database connection synchronously.

Returns:
void

getAllKeys()

Android
iOS
macOS
tvOS
Web

Alias for getAllKeysAsync() method.

Returns:
Promise<string[]>

getAllKeysAsync()

Android
iOS
macOS
tvOS
Web

Retrieves all keys stored in the storage asynchronously.

Returns:
Promise<string[]>

getAllKeysSync()

Android
iOS
macOS
tvOS
Web

Retrieves all keys stored in the storage synchronously.

Returns:
string[]

getItem(key)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring

Alias for getItemAsync() method.

Returns:
Promise<string | null>

getItemAsync(key)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring

Retrieves the value associated with the given key asynchronously.

Returns:
Promise<string | null>

getItemSync(key)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring

Retrieves the value associated with the given key synchronously.

Returns:
string | null

getKeyByIndexAsync(index)

Android
iOS
macOS
tvOS
Web
ParameterType
indexnumber

Retrieves the key at the given index asynchronously.

Returns:
Promise<string | null>

getKeyByIndexSync(index)

Android
iOS
macOS
tvOS
Web
ParameterType
indexnumber

Retrieves the key at the given index synchronously.

Returns:
string | null

getLengthAsync()

Android
iOS
macOS
tvOS
Web

Retrieves the number of key-value pairs stored in the storage asynchronously.

Returns:
Promise<number>

getLengthSync()

Android
iOS
macOS
tvOS
Web

Retrieves the number of key-value pairs stored in the storage synchronously.

Returns:
number

mergeItem(key, value)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring
valuestring

Merges the given value with the existing value for the given key asynchronously. If the existing value is a JSON object, performs a deep merge.

Returns:
Promise<void>

multiGet(keys)

Android
iOS
macOS
tvOS
Web
ParameterType
keysstring[]

Retrieves the values associated with the given keys asynchronously.

Returns:
Promise<undefined>

multiMerge(keyValuePairs)

Android
iOS
macOS
tvOS
Web
ParameterType
keyValuePairsundefined

Merges multiple key-value pairs asynchronously. If existing values are JSON objects, performs a deep merge.

Returns:
Promise<void>

multiRemove(keys)

Android
iOS
macOS
tvOS
Web
ParameterType
keysstring[]

Removes the values associated with the given keys asynchronously.

Returns:
Promise<void>

multiSet(keyValuePairs)

Android
iOS
macOS
tvOS
Web
ParameterType
keyValuePairsundefined

Sets multiple key-value pairs asynchronously.

Returns:
Promise<void>

removeItem(key)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring

Alias for removeItemAsync() method.

Returns:
Promise<void>

removeItemAsync(key)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring

Removes the value associated with the given key asynchronously.

Returns:
Promise<boolean>

removeItemSync(key)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring

Removes the value associated with the given key synchronously.

Returns:
boolean

setItem(key, value)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring
valuestring | SQLiteStorageSetItemUpdateFunction

Alias for setItemAsync().

Returns:
Promise<void>

setItemAsync(key, value)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring
valuestring | SQLiteStorageSetItemUpdateFunction

Sets the value for the given key asynchronously. If a function is provided, it computes the new value based on the previous value.

Returns:
Promise<void>

setItemSync(key, value)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring
valuestring | SQLiteStorageSetItemUpdateFunction

Sets the value for the given key synchronously. If a function is provided, it computes the new value based on the previous value.

Returns:
void

SQLiteTaggedQuery

Android
iOS
macOS
tvOS
Web

Type: Class implements PromiseLike<SQLiteTaggedQueryResult<T>>

A SQL query with tagged template literals API that can be awaited directly (returns array of objects by default), or transformed using .values() or .first() methods.

This API is inspired by Bun's SQL interface:

Example

// Default: returns array of objects const users = await sql`SELECT * FROM users WHERE age > ${21}`; // Get values as arrays const values = await sql`SELECT name, age FROM users`.values(); // Returns: [["Alice", 30], ["Bob", 25]] // Get first row only const user = await sql`SELECT * FROM users WHERE id = ${1}`.first(); // With type parameter const users = await sql<User>`SELECT * FROM users`; // Mutable queries return SQLiteRunResult const result = await sql`INSERT INTO users (name) VALUES (${"Alice"})` as SQLiteRunResult; console.log(result.lastInsertRowId, result.changes); // Synchronous API const users = sql<User>`SELECT * FROM users WHERE age > ${21}`.allSync(); const user = sql<User>`SELECT * FROM users WHERE id = ${userId}`.firstSync();

SQLiteTaggedQuery Methods

allSync()

Android
iOS
macOS
tvOS
Web

Execute a query synchronously that returns rows or metadata based on query type.

Returns:
SQLiteTaggedQueryResult<T>

each()

Android
iOS
macOS
tvOS
Web

Execute the query and return an async iterator over the rows.

Example

for await (const user of sql`SELECT * FROM users`.each()) { console.log(user.name); }

eachSync()

Android
iOS
macOS
tvOS
Web

Execute the query synchronously and return an iterator.

Returns:
IterableIterator<T>

first()

Android
iOS
macOS
tvOS
Web

Execute the query and return the first row only. Returns null if no rows match.

Returns:
Promise<T | null>

Example

const user = await sql`SELECT * FROM users WHERE id = ${1}`.first();

firstSync()

Android
iOS
macOS
tvOS
Web

Execute the query synchronously and return the first row.

Returns:
T | null

values()

Android
iOS
macOS
tvOS
Web

Execute the query and return rows as arrays of values (Bun-style). Each row is an array where values are in column order.

Returns:
Promise<any[][]>

Example

const rows = await sql`SELECT name, age FROM users`.values(); // Returns: [["Alice", 30], ["Bob", 25]]

valuesSync()

Android
iOS
macOS
tvOS
Web

Execute the query synchronously and return rows as arrays of values.

Returns:
any[][]

Props

assetSource

Android
iOS
macOS
tvOS
Web
Optional • Type: SQLiteProviderAssetSource

Import a bundled database file from the specified asset module.

Example

assetSource={{ assetId: require('./assets/db.db') }}

children

Android
iOS
macOS
tvOS
Web
Type: ReactNode

The children to render.

databaseName

Android
iOS
macOS
tvOS
Web
Type: string

The name of the database file to open.

directory

Android
iOS
macOS
tvOS
Web
Optional • Type: string • Default: defaultDatabaseDirectory

The directory where the database file is located.

onError

Android
iOS
macOS
tvOS
Web
Optional • Type: (error: Error) => void • Default: rethrow the error

Handle errors from SQLiteProvider.

onInit

Android
iOS
macOS
tvOS
Web
Optional • Type: (db: SQLiteDatabase) => Promise<void>

A custom initialization handler to run before rendering the children. You can use this to run database migrations or other setup tasks.

options

Android
iOS
macOS
tvOS
Web
Optional • Type: SQLiteOpenOptions

Open options.

useSuspense

Android
iOS
macOS
tvOS
Web
Optional • Type: boolean • Default: false

Enable React.Suspense integration.

Example

export default function App() { return ( <Suspense fallback={<Text>Loading...</Text>}> <SQLiteProvider databaseName="test.db" useSuspense={true}> <Main /> </SQLiteProvider> </Suspense> ); }

Methods

SQLite.backupDatabaseAsync(options)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
options{ destDatabase: SQLiteDatabase, destDatabaseName: string, sourceDatabase: SQLiteDatabase, sourceDatabaseName: string }

The backup options


Backup a database to another database.

Returns:
Promise<void>

SQLite.backupDatabaseSync(options)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
options{ destDatabase: SQLiteDatabase, destDatabaseName: string, sourceDatabase: SQLiteDatabase, sourceDatabaseName: string }

The backup options


Backup a database to another database.

Returns:
void

SQLite.deepEqual(a, b)

Android
iOS
macOS
tvOS
Web
ParameterType
aundefined | undefined
bundefined | undefined

Compares two objects deeply for equality.

Returns:
boolean

SQLite.deleteDatabaseAsync(databaseName, directory)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
databaseNamestring

The name of the database file to delete.

directory(optional)string

The directory where the database file is located. The default value is defaultDatabaseDirectory.


Delete a database file.

Returns:
Promise<void>

SQLite.deleteDatabaseSync(databaseName, directory)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
databaseNamestring

The name of the database file to delete.

directory(optional)string

The directory where the database file is located. The default value is defaultDatabaseDirectory.


Delete a database file.

Returns:
void

SQLite.deserializeDatabaseAsync(serializedData, options)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
serializedDataUint8Array

The binary array to deserialize from SQLiteDatabase.serializeAsync().

options(optional)SQLiteOpenOptions

Open options.


Given a Uint8Array data and deserialize to memory database.

SQLite.deserializeDatabaseSync(serializedData, options)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
serializedDataUint8Array

The binary array to deserialize from SQLiteDatabase.serializeSync()

options(optional)SQLiteOpenOptions

Open options.


Given a Uint8Array data and deserialize to memory database.

SQLite.openDatabaseAsync(databaseName, options, directory)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
databaseNamestring

The name of the database file to open.

options(optional)SQLiteOpenOptions

Open options.

directory(optional)string

The directory where the database file is located. The default value is defaultDatabaseDirectory. This parameter is not supported on web.


Open a database.

SQLite.openDatabaseSync(databaseName, options, directory)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
databaseNamestring

The name of the database file to open.

options(optional)SQLiteOpenOptions

Open options.

directory(optional)string

The directory where the database file is located. The default value is defaultDatabaseDirectory. This parameter is not supported on web.


Open a database.

Event subscriptions

SQLite.addDatabaseChangeListener(listener)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
listener(event: DatabaseChangeEvent) => void

A function that receives the databaseName, databaseFilePath, tableName and rowId of the modified data.


Add a listener for database changes.

Returns:
EventSubscription

A Subscription object that you can call remove() on when you would like to unsubscribe the listener.

Interfaces

SQLiteExecuteAsyncResult

Android
iOS
macOS
tvOS
Web

Extends: AsyncIterableIterator<T>

A result returned by SQLiteStatement.executeAsync().

Example

The result includes the lastInsertRowId and changes properties. You can get the information from the write operations.

const statement = await db.prepareAsync('INSERT INTO test (value) VALUES (?)'); try { const result = await statement.executeAsync(101); console.log('lastInsertRowId:', result.lastInsertRowId); console.log('changes:', result.changes); } finally { await statement.finalizeAsync(); }

Example

The result implements the AsyncIterator interface, so you can use it in for await...of loops.

const statement = await db.prepareAsync('SELECT value FROM test WHERE value > ?'); try { const result = await statement.executeAsync<{ value: number }>(100); for await (const row of result) { console.log('row value:', row.value); } } finally { await statement.finalizeAsync(); }

Example

If your write operations also return values, you can mix all of them together.

const statement = await db.prepareAsync('INSERT INTO test (name, value) VALUES (?, ?) RETURNING name'); try { const result = await statement.executeAsync<{ name: string }>('John Doe', 101); console.log('lastInsertRowId:', result.lastInsertRowId); console.log('changes:', result.changes); for await (const row of result) { console.log('name:', row.name); } } finally { await statement.finalizeAsync(); }
PropertyTypeDescription
changesnumber

The number of rows affected. Returned from the sqlite3_changes() function.

lastInsertRowIdnumber

The last inserted row ID. Returned from the sqlite3_last_insert_rowid() function.

SQLiteExecuteAsyncResult Methods

getAllAsync()

Android
iOS
macOS
tvOS
Web

Get all rows of the result set. This requires the SQLite cursor to be in its initial state. If you have already retrieved rows from the result set, you need to reset the cursor first by calling resetAsync(). Otherwise, an error will be thrown.

Returns:
Promise<T[]>

getFirstAsync()

Android
iOS
macOS
tvOS
Web

Get the first row of the result set. This requires the SQLite cursor to be in its initial state. If you have already retrieved rows from the result set, you need to reset the cursor first by calling resetAsync(). Otherwise, an error will be thrown.

Returns:
Promise<T | null>

resetAsync()

Android
iOS
macOS
tvOS
Web

Reset the prepared statement cursor. This will call the sqlite3_reset() C function under the hood.

Returns:
Promise<void>

SQLiteExecuteSyncResult

Android
iOS
macOS
tvOS
Web

Extends: IterableIterator<T>

A result returned by SQLiteStatement.executeSync().

Example

The result includes the lastInsertRowId and changes properties. You can get the information from the write operations.

const statement = db.prepareSync('INSERT INTO test (value) VALUES (?)'); try { const result = statement.executeSync(101); console.log('lastInsertRowId:', result.lastInsertRowId); console.log('changes:', result.changes); } finally { statement.finalizeSync(); }

Example

The result implements the Iterator interface, so you can use it in for...of loops.

const statement = db.prepareSync('SELECT value FROM test WHERE value > ?'); try { const result = statement.executeSync<{ value: number }>(100); for (const row of result) { console.log('row value:', row.value); } } finally { statement.finalizeSync(); }

Example

If your write operations also return values, you can mix all of them together.

const statement = db.prepareSync('INSERT INTO test (name, value) VALUES (?, ?) RETURNING name'); try { const result = statement.executeSync<{ name: string }>('John Doe', 101); console.log('lastInsertRowId:', result.lastInsertRowId); console.log('changes:', result.changes); for (const row of result) { console.log('name:', row.name); } } finally { statement.finalizeSync(); }
PropertyTypeDescription
changesnumber

The number of rows affected. Returned from the sqlite3_changes() function.

lastInsertRowIdnumber

The last inserted row ID. Returned from the sqlite3_last_insert_rowid() function.

SQLiteExecuteSyncResult Methods

getAllSync()

Android
iOS
macOS
tvOS
Web

Get all rows of the result set. This requires the SQLite cursor to be in its initial state. If you have already retrieved rows from the result set, you need to reset the cursor first by calling resetSync(). Otherwise, an error will be thrown.

Returns:
T[]

getFirstSync()

Android
iOS
macOS
tvOS
Web

Get the first row of the result set. This requires the SQLite cursor to be in its initial state. If you have already retrieved rows from the result set, you need to reset the cursor first by calling resetSync(). Otherwise, an error will be thrown.

Returns:
T | null

resetSync()

Android
iOS
macOS
tvOS
Web

Reset the prepared statement cursor. This will call the sqlite3_reset() C function under the hood.

Returns:
void

SQLiteOpenOptions

Android
iOS
macOS
tvOS
Web

Options for opening a database.

PropertyTypeDescription
enableChangeListener(optional)boolean

Whether to call the sqlite3_update_hook() function and enable the onDatabaseChange events. You can later subscribe to the change events by addDatabaseChangeListener.

Default:false
libSQLOptions(optional){ authToken: string, remoteOnly: boolean, url: string }

Options for libSQL integration.

useNewConnection(optional)boolean

Whether to create new connection even if connection with the same database name exists in cache.

Default:false

SQLiteProviderAssetSource

Android
iOS
macOS
tvOS
Web
PropertyTypeDescription
assetIdnumber

The asset ID returned from the require() call.

forceOverwrite(optional)boolean

Force overwrite the local database file even if it already exists.

Default:false

SQLiteRunResult

Android
iOS
macOS
tvOS
Web
PropertyTypeDescription
changesnumber

The number of rows affected. Returned from the sqlite3_changes() function.

lastInsertRowIdnumber

The last inserted row ID. Returned from the sqlite3_last_insert_rowid() function.

Types

Changeset

Android
iOS
macOS
tvOS
Web

Type: Uint8Array

A type that represents a changeset.

DatabaseChangeEvent

Android
iOS
macOS
tvOS
Web

The event payload for the listener of addDatabaseChangeListener

PropertyTypeDescription
databaseFilePathstring

The absolute file path to the database.

databaseNamestring

The database name. The value would be main by default and other database names if you use ATTACH DATABASE statement.

rowIdnumber

The changed row ID.

tableNamestring

The table name.

SQLiteBindParams

Android
iOS
macOS
tvOS
Web

Literal type: Record

Acceptable values are: Record<string, SQLiteBindValue>

SQLiteBindValue

Android
iOS
macOS
tvOS
Web

Literal type: union

Bind parameters to the prepared statement. You can either pass the parameters in the following forms:

Example

A single array for unnamed parameters.

const statement = await db.prepareAsync('SELECT * FROM test WHERE value = ? AND intValue = ?'); const result = await statement.executeAsync(['test1', 789]); const firstRow = await result.getFirstAsync();

Example

Variadic arguments for unnamed parameters.

const statement = await db.prepareAsync('SELECT * FROM test WHERE value = ? AND intValue = ?'); const result = await statement.executeAsync('test1', 789); const firstRow = await result.getFirstAsync();

Example

A single object for named parameters

We support multiple named parameter forms such as :VVV, @VVV, and $VVV. We recommend using $VVV because JavaScript allows using $ in identifiers without escaping.

const statement = await db.prepareAsync('SELECT * FROM test WHERE value = $value AND intValue = $intValue'); const result = await statement.executeAsync({ $value: 'test1', $intValue: 789 }); const firstRow = await result.getFirstAsync();

Acceptable values are: string | number | null | boolean | SQLiteBindBlobValue

SQLiteStorageSetItemUpdateFunction(prevValue)

Android
iOS
macOS
tvOS
Web

Update function for the setItemAsync() or setItemSync() method. It computes the new value based on the previous value. The function returns the new value to set for the key.

ParameterTypeDescription
prevValuestring | null

The previous value associated with the key, or null if the key was not set.

Returns:

string

SQLiteVariadicBindParams

Android
iOS
macOS
tvOS
Web

Type: SQLiteBindValue[]