Expo SQLite iconExpo SQLite

提供对可通过 SQLite API 查询的数据库的访问的库。

Android
iOS
macOS
tvOS
Web
Included in Expo Go
Bundled version:
~16.0.10

expo-sqlite 使你的应用可以访问一个可以通过 SQLite API 查询的数据库。该数据库在应用重启后仍会保留。

警告 在 Apple TV 上,底层数据库文件位于缓存目录中,而不是应用文档目录中,依据 Apple 平台指南

安装

🌐 Installation

Terminal
npx expo install expo-sqlite

If you are installing this in an existing React Native app, make sure to install expo in your project.

应用配置中的配置

🌐 Configuration in app config

如果在项目中使用配置插件(连续原生生成 (CNG)),你可以使用内置的 配置插件 来为 expo-sqlite 进行高级配置。该插件允许你配置一些无法在运行时设置、需要生成新应用二进制文件才能生效的属性。如果你的应用使用 CNG,则需要手动配置该库。

🌐 You can configure expo-sqlite for advanced configurations using its built-in config plugin if you use config plugins in your project (Continuous Native Generation (CNG)). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect. If your app does not use CNG, then you'll need to manually configure the library.

Example app.json with config plugin

app.json
{ "expo": { "plugins": [ [ "expo-sqlite", { "enableFTS": true, "useSQLCipher": true, "android": { // Override the shared configuration for Android "enableFTS": false, "useSQLCipher": false }, "ios": { // You can also override the shared configurations for iOS "customBuildFlags": ["-DSQLITE_ENABLE_DBSTAT_VTAB=1 -DSQLITE_ENABLE_SNAPSHOT=1"] } } ] ] } }

Configurable properties

NameDefaultDescription
customBuildFlags-

传递给 SQLite 构建过程的自定义构建标志。

enableFTStrue

是否启用 FTS3, FTS4FTS5 扩展。

useSQLCipherfalse

使用 SQLCipher 实现而非默认的 SQLite。

withSQLiteVecExtensionfalse

sqlite-vec 扩展包含到 bundledExtensions 中。

Web 设置

🌐 Web setup

重要 Web 支持处于测试阶段,可能不稳定。如果遇到任何问题,请在 GitHub 上创建问题

要在网页上使用 expo-sqlite,你需要配置 Metro 打包器以支持 wasm 文件,并添加 HTTP 头以允许使用 SharedArrayBuffer

🌐 To use expo-sqlite on web, you need to configure Metro bundler to support wasm files and add HTTP headers to allow SharedArrayBuffer usage.

将以下配置添加到你的 metro.config.js 中。如果你还没有 metro.config.js,可以运行 npx expo customize metro.config.js了解更多

🌐 Add the following configuration to your metro.config.js. If you don't have the metro.config.js yet, you can run npx expo customize metro.config.js. Learn more.

如果你将应用部署到网络托管服务,你还需要在你的Web服务器中添加 Cross-Origin-Embedder-PolicyCross-Origin-Opener-Policy 头。 了解有关 COEPCOOP 头以及 SharedArrayBuffer 的更多信息

🌐 If you deploy your app to web hosting services, you will also need to add the Cross-Origin-Embedder-Policy and Cross-Origin-Opener-Policy headers to your web server. Learn more about the COEP, COOP headers, and SharedArrayBuffer.

用法

🌐 Usage

expo-sqlite 导入模块。

🌐 Import the module from expo-sqlite.

Import the module from expo-sqlite
import * as SQLite from 'expo-sqlite';

基本 CRUD 操作

🌐 Basic CRUD operations

Basic CRUD operations
const db = await SQLite.openDatabaseAsync('databaseName'); // `execAsync()` is useful for bulk queries when you want to execute altogether. // Note that `execAsync()` does not escape parameters and may lead to SQL injection. await db.execAsync(` PRAGMA journal_mode = WAL; CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY NOT NULL, value TEXT NOT NULL, intValue INTEGER); INSERT INTO test (value, intValue) VALUES ('test1', 123); INSERT INTO test (value, intValue) VALUES ('test2', 456); INSERT INTO test (value, intValue) VALUES ('test3', 789); `); // `runAsync()` is useful when you want to execute some write operations. const result = await db.runAsync('INSERT INTO test (value, intValue) VALUES (?, ?)', 'aaa', 100); console.log(result.lastInsertRowId, result.changes); await db.runAsync('UPDATE test SET intValue = ? WHERE value = ?', 999, 'aaa'); // Binding unnamed parameters from variadic arguments await db.runAsync('UPDATE test SET intValue = ? WHERE value = ?', [999, 'aaa']); // Binding unnamed parameters from array await db.runAsync('DELETE FROM test WHERE value = $value', { $value: 'aaa' }); // Binding named parameters from object // `getFirstAsync()` is useful when you want to get a single row from the database. const firstRow = await db.getFirstAsync('SELECT * FROM test'); console.log(firstRow.id, firstRow.value, firstRow.intValue); // `getAllAsync()` is useful when you want to get all results as an array of objects. const allRows = await db.getAllAsync('SELECT * FROM test'); for (const row of allRows) { console.log(row.id, row.value, row.intValue); } // `getEachAsync()` is useful when you want to iterate SQLite query cursor. for await (const row of db.getEachAsync('SELECT * FROM test')) { console.log(row.id, row.value, row.intValue); }

准备好的报表

🌐 Prepared statements

预处理语句允许你将 SQL 查询编译一次,并使用不同的参数多次执行。它们会自动转义输入参数,以防止 SQL 注入攻击,并且推荐用于包含用户输入的查询。你可以通过在数据库实例上调用 prepareAsync()prepareSync() 方法来获取预处理语句。该预处理语句可以通过调用 executeAsync()executeSync() 方法来完成 CRUD 操作。

🌐 Prepared statements allow you to compile your SQL query once and execute it multiple times with different parameters. They automatically escape input parameters to defend against SQL injection attacks, and are recommended for queries that include user input. You can get a prepared statement by calling prepareAsync() or prepareSync() method on a database instance. The prepared statement can fulfill CRUD operations by calling executeAsync() or executeSync() method.

注意: 使用完准备好的语句后,记得调用 finalizeAsync()finalizeSync() 方法来释放准备好的语句。建议使用 try-finally 块以确保准备好的语句被正确终结。

Prepared statements
const statement = await db.prepareAsync( 'INSERT INTO test (value, intValue) VALUES ($value, $intValue)' ); try { let result = await statement.executeAsync({ $value: 'bbb', $intValue: 101 }); console.log('bbb and 101:', result.lastInsertRowId, result.changes); result = await statement.executeAsync({ $value: 'ccc', $intValue: 102 }); console.log('ccc and 102:', result.lastInsertRowId, result.changes); result = await statement.executeAsync({ $value: 'ddd', $intValue: 103 }); console.log('ddd and 103:', result.lastInsertRowId, result.changes); } finally { await statement.finalizeAsync(); } const statement2 = await db.prepareAsync('SELECT * FROM test WHERE intValue >= $intValue'); try { const result = await statement2.executeAsync<{ value: string; intValue: number }>({ $intValue: 100, }); // `getFirstAsync()` is useful when you want to get a single row from the database. const firstRow = await result.getFirstAsync(); console.log(firstRow.id, firstRow.value, firstRow.intValue); // Reset the SQLite query cursor to the beginning for the next `getAllAsync()` call. await result.resetAsync(); // `getAllAsync()` is useful when you want to get all results as an array of objects. const allRows = await result.getAllAsync(); for (const row of allRows) { console.log(row.value, row.intValue); } // Reset the SQLite query cursor to the beginning for the next `for-await-of` loop. await result.resetAsync(); // The result object is also an async iterable. You can use it in `for-await-of` loop to iterate SQLite query cursor. for await (const row of result) { console.log(row.value, row.intValue); } } finally { await statement2.finalizeAsync(); }

useSQLiteContext()

🌐 useSQLiteContext() hook

useSQLiteContext() hook
import { SQLiteProvider, useSQLiteContext, type SQLiteDatabase } from 'expo-sqlite'; import { useEffect, useState } from 'react'; import { View, Text, StyleSheet } from 'react-native'; export default function App() { return ( <View style={styles.container}> <SQLiteProvider databaseName="test.db" onInit={migrateDbIfNeeded}> <Header /> <Content /> </SQLiteProvider> </View> ); } export function Header() { const db = useSQLiteContext(); const [version, setVersion] = useState(''); useEffect(() => { async function setup() { const result = await db.getFirstAsync<{ 'sqlite_version()': string }>( 'SELECT sqlite_version()' ); setVersion(result['sqlite_version()']); } setup(); }, []); return ( <View style={styles.headerContainer}> <Text style={styles.headerText}>SQLite version: {version}</Text> </View> ); } interface Todo { value: string; intValue: number; } export function Content() { const db = useSQLiteContext(); const [todos, setTodos] = useState<Todo[]>([]); useEffect(() => { async function setup() { const result = await db.getAllAsync<Todo>('SELECT * FROM todos'); setTodos(result); } setup(); }, []); return ( <View style={styles.contentContainer}> {todos.map((todo, index) => ( <View style={styles.todoItemContainer} key={index}> <Text>{`${todo.intValue} - ${todo.value}`}</Text> </View> ))} </View> ); } async function migrateDbIfNeeded(db: SQLiteDatabase) { const DATABASE_VERSION = 1; let { user_version: currentDbVersion } = await db.getFirstAsync<{ user_version: number }>( 'PRAGMA user_version' ); if (currentDbVersion >= DATABASE_VERSION) { return; } if (currentDbVersion === 0) { await db.execAsync(` PRAGMA journal_mode = 'wal'; CREATE TABLE todos (id INTEGER PRIMARY KEY NOT NULL, value TEXT NOT NULL, intValue INTEGER); `); await db.runAsync('INSERT INTO todos (value, intValue) VALUES (?, ?)', 'hello', 1); await db.runAsync('INSERT INTO todos (value, intValue) VALUES (?, ?)', 'world', 2); currentDbVersion = 1; } // if (currentDbVersion === 1) { // Add more migrations // } await db.execAsync(`PRAGMA user_version = ${DATABASE_VERSION}`); } const styles = StyleSheet.create({ // Your styles... });

useSQLiteContext()React.Suspense

🌐 useSQLiteContext() hook with React.Suspense

useSQLiteContext() 钩子类似,你也可以将 SQLiteProviderReact.Suspense 集成,以在数据库准备好之前显示一个备用组件。要启用此集成,请将 useSuspense 属性传递给 SQLiteProvider 组件。

🌐 As with the useSQLiteContext() hook, you can also integrate the SQLiteProvider with React.Suspense to show a fallback component until the database is ready. To enable the integration, pass the useSuspense prop to the SQLiteProvider component.

useSQLiteContext() hook with React.Suspense
import { SQLiteProvider, useSQLiteContext } from 'expo-sqlite'; import { Suspense } from 'react'; import { View, Text, StyleSheet } from 'react-native'; export default function App() { return ( <View style={styles.container}> <Suspense fallback={<Fallback />}> <SQLiteProvider databaseName="test.db" onInit={migrateDbIfNeeded} useSuspense> <Header /> <Content /> </SQLiteProvider> </Suspense> </View> ); }

在异步事务中执行查询

🌐 Executing queries within an async transaction

Executing queries within an async transaction
const db = await SQLite.openDatabaseAsync('databaseName'); await db.withTransactionAsync(async () => { const result = await db.getFirstAsync('SELECT COUNT(*) FROM USERS'); console.log('Count:', result.rows[0]['COUNT(*)']); });

由于 async/await 的特性,事务激活期间运行的任何查询都会被包含在事务中。这包括传递给 withTransactionAsync() 的作用域函数之外的查询语句,这可能会导致意外行为。例如,下面的测试用例在传递给 withTransactionAsync() 的作用域函数的内部和外部运行查询。然而,由于第二个 UPDATE 查询在事务完成之前运行,所有查询都会在实际的 SQL 事务中执行。

🌐 Due to the nature of async/await, any query that runs while the transaction is active will be included in the transaction. This includes query statements that are outside of the scope function passed to withTransactionAsync() and may be surprising behavior. For example, the following test case runs queries inside and outside of a scope function passed to withTransactionAsync(). However, all of the queries will run within the actual SQL transaction because the second UPDATE query runs before the transaction finishes.

Promise.all([ // 1. A new transaction begins db.withTransactionAsync(async () => { // 2. The value "first" is inserted into the test table and we wait 2 // seconds await db.execAsync('INSERT INTO test (data) VALUES ("first")'); await sleep(2000); // 4. Two seconds in, we read the latest data from the table const row = await db.getFirstAsync<{ data: string }>('SELECT data FROM test'); // ❌ The data in the table will be "second" and this expectation will fail. // Additionally, this expectation will throw an error and roll back the // transaction, including the `UPDATE` query below since it ran within // the transaction. expect(row.data).toBe('first'); }), // 3. One second in, the data in the test table is updated to be "second". // This `UPDATE` query runs in the transaction even though its code is // outside of it because the transaction happens to be active at the time // this query runs. sleep(1000).then(async () => db.execAsync('UPDATE test SET data = "second"')), ]);

[withExclusiveTransactionAsync()](#withexclusivetransactionasynctask) 函数可以解决这个问题。只有在传递给 withExclusiveTransactionAsync() 的作用域函数中运行的查询才会在实际的 SQL 事务中执行。

🌐 The withExclusiveTransactionAsync() function addresses this. Only queries that run within the scope function passed to withExclusiveTransactionAsync() will run within the actual SQL transaction.

执行 PRAGMA 查询

🌐 Executing PRAGMA queries

Executing PRAGMA queries
const db = await SQLite.openDatabaseAsync('databaseName'); await db.execAsync('PRAGMA journal_mode = WAL'); await db.execAsync('PRAGMA foreign_keys = ON');

信息 提示: 创建新数据库时启用 WAL 日志模式 可提高整体性能。

导入现有数据库

🌐 Import an existing database

要使用已有的 .db 文件打开一个新的 SQLite 数据库,你可以使用 SQLiteProvider 配合 assetSource

🌐 To open a new SQLite database using an existing .db file you already have, you can use the SQLiteProvider with assetSource.

useSQLiteContext() with existing database
import { SQLiteProvider, useSQLiteContext } from 'expo-sqlite'; import { View, Text, StyleSheet } from 'react-native'; export default function App() { return ( <View style={styles.container}> <SQLiteProvider databaseName="test.db" assetSource={{ assetId: require('./assets/test.db') }}> <Header /> <Content /> </SQLiteProvider> </View> ); }

与多个应用共享模块

🌐 Sharing a database between apps/extensions (iOS)

要与同一应用组中的其他应用/扩展共享数据库,你可以按照以下步骤使用共享容器:

🌐 To share a database with other apps/extensions in the same App Group, you can use shared containers by following the steps below:

1

在应用配置中配置应用组:

🌐 Configure the App Group in app config:

app.json
{ "expo": { "ios": { "bundleIdentifier": "com.myapp", "entitlements": { "com.apple.security.application-groups": ["group.com.myapp"] } } } }

2

使用 Paths.appleSharedContainersexpo-file-system 库中获取共享容器的路径:

🌐 Use Paths.appleSharedContainers from the expo-file-system library to retrieve the path to the shared container:

Using Shared Container for SQLite Database on iOS
import { SQLiteProvider, defaultDatabaseDirectory } from 'expo-sqlite'; import { Paths } from 'expo-file-system'; import { useMemo } from 'react'; import { Platform, View } from 'react-native'; export default function App() { const dbDirectory = useMemo(() => { if (Platform.OS === 'ios') { return Object.values(Paths.appleSharedContainers)?.[0]?.uri; // or `Paths.appleSharedContainers['group.com.myapp']?.uri` to choose specific container } return defaultDatabaseDirectory; }, []); return ( <View style={styles.container}> <SQLiteProvider databaseName="test.db" directory={dbDirectory}> <Header /> <Content /> </SQLiteProvider> </View> ); }

传输二进制数据

🌐 Passing binary data

使用 Uint8Array 将二进制数据传递给数据库:

🌐 Use Uint8Array to pass binary data to the database:

Passing binary data
await db.execAsync(` DROP TABLE IF EXISTS blobs; CREATE TABLE IF NOT EXISTS blobs (id INTEGER PRIMARY KEY NOT NULL, data BLOB); `); const blob = new Uint8Array([0x00, 0x01, 0x02, 0x03, 0x04, 0x05]); await db.runAsync('INSERT INTO blobs (data) VALUES (?)', blob); const row = await db.getFirstAsync<{ data: Uint8Array }>('SELECT * FROM blobs'); expect(row.data).toEqual(blob);

浏览设备上的数据库

🌐 Browse an on-device database

你可以检查数据库、对其执行查询,并使用 drizzle-studio-expo 开发工具插件 探索数据。该插件使你能够直接从 Expo CLI 启动连接到应用中数据库的 Drizzle Studio。该插件可以与任何 expo-sqlite 配置一起使用。它不要求你在应用中使用 Drizzle ORM了解如何安装和使用该插件

🌐 You can inspect a database, execute queries against it, and explore data with the drizzle-studio-expo dev tools plugin. This plugin enables you to launch Drizzle Studio, connected to a database in your app, directly from Expo CLI. This plugin can be used with any expo-sqlite configuration. It does not require that you use Drizzle ORM in your app. Learn how to install and use the plugin.

键值存储

🌐 Key-value storage

expo-sqlite 库提供了 Storage 作为 @react-native-async-storage/async-storage 库的可替换方案。这个键值存储由 SQLite 支持。如果你的项目已经使用 expo-sqlite,你可以利用 expo-sqlite/kv-store 而无需添加其他依赖。

🌐 The expo-sqlite library provides Storage as a drop-in replacement for the @react-native-async-storage/async-storage library. This key-value store is backed by SQLite. If your project already uses expo-sqlite, you can leverage expo-sqlite/kv-store without needing to add another dependency.

Storage 提供与 @react-native-async-storage/async-storage 相同的 API:

Using the Store
// The storage API is the default export, you can call it Storage, AsyncStorage, or whatever you prefer. 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,以提供更多便利性:

🌐 A key benefit of using expo-sqlite/kv-store is the addition of synchronous APIs for added convenience:

Using the Store with synchronous APIs
// The storage API is the default export, you can call it Storage, AsyncStorage, or whatever you prefer. 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 只需更改导入语句即可:

🌐 If you're currently using @react-native-async-storage/async-storage in your project, switching to expo-sqlite/kv-store is as simple as changing the import statement:

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

localStorage API

🌐 The localStorage API

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

🌐 The expo-sqlite/localStorage/install module provides a drop-in implementation for the localStorage API. If you're already familiar with this API from the web, or you would like to be able to share storage code between web and other platforms, this may be useful. To use it, you just need to import the expo-sqlite/localStorage/install module:

注意: import 'expo-sqlite/localStorage/install'; 在网页上是无操作的,并且会被排除在生产环境的 JS 包之外。

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

安全

🌐 Security

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

🌐 SQL injections are a class of vulnerabilities where attackers trick your app into executing user input as SQL code. You must escape all user input passed to SQLite to defend against SQL injections. Prepared statements are an effective defense against this problem. They explicitly separate a SQL query's logic from its input parameters, and SQLite automatically escapes inputs when executing prepared statements.

第三方库集成

🌐 Third-party library integrations

expo-sqlite 库旨在成为一个可靠的 SQLite 基础。它支持与第三方库进行更广泛的集成,从而实现更高级的高级功能。以下是一些可以与 expo-sqlite 配合使用的库。

🌐 The expo-sqlite library is designed to be a solid SQLite foundation. It enables broader integrations with third-party libraries for more advanced higher-level features. Here are some of the libraries that you can use with expo-sqlite.

Drizzle ORM

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

查看 Drizzle ORM 文档expo-sqlite 集成指南 以了解更多详情。

🌐 Check out the Drizzle ORM documentation and the expo-sqlite integration guide for more details.

Knex.js

[Knex.js](https://knex.nodejs.cn/) 是一款 SQL 查询构建器,具有“灵活、可移植且使用乐趣!”。(https://github.com/knex/knex)

请查看expo-sqlite集成指南以获取更多详细信息。

🌐 Check out the expo-sqlite integration guide for more details.

SQLCipher

注意: SQLCipher 不支持 Expo Go

SQLCipher 是 SQLite 的一个分支,为数据库增加了加密和认证功能。expo-sqlite 库支持 Android、iOS 和 macOS 的 SQLCipher。要使用 SQLCipher,你需要将 useSQLCipher 配置添加到你的 app.json 中,如 应用配置中的配置 部分所示,并运行 npx expo prebuild

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

🌐 Right after you open a database, you need to set a password for the database using the PRAGMA key = 'password' statement.

Add a password to the database
const db = await SQLite.openDatabaseAsync('databaseName'); await db.execAsync(`PRAGMA key = 'password'`);

应用接口

🌐 API

常用 API 速查表

🌐 Cheatsheet for the common API

下表总结了 SQLiteDatabaseSQLiteStatement 类的常用 API:

🌐 The following table summarizes the common API for SQLiteDatabase and SQLiteStatement classes:

SQLiteDatabase methodsSQLiteStatement methodsDescriptionUse Case
runAsync()executeAsync()Executes a SQL query, returning information on the changes made.Ideal for SQL write operations such as INSERT, UPDATE, DELETE.
getFirstAsync()executeAsync() + getFirstAsync()Retrieves the first row from the query result.Suitable for fetching a single row from the database. For example: getFirstAsync('SELECT * FROM Users WHERE id = ?', userId).
getAllAsync()executeAsync() + getFirstAsync()Fetches all query results at once.Best suited for scenarios with smaller result sets, such as queries with a LIMIT clause, like SELECT * FROM Table LIMIT 100, where you intend to retrieve all results in a single batch.
getEachAsync()executeAsync() + for-await-of async iteratorProvides an iterator for result set traversal. This method fetches one row at a time from the database, potentially reducing memory usage compared to getAllAsync().Recommended for handling large result sets incrementally, such as with infinite scrolling implementations.

Component

SQLiteProvider

Android
iOS
macOS
tvOS
Web

Type: React.Element<SQLiteProviderProps>

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.

SQLiteProviderProps

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> ); }

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.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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

execAsync(source)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
sourcestring

A string containing all the SQL queries.


Execute all SQL queries in the supplied string.

Note: The queries are not escaped for you! Be careful when constructing your queries.

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.

Note: The queries are not escaped for you! Be careful when constructing your queries.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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().

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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().

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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().

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

Returns:
null | T

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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().

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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'

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

Returns:
Uint8Array

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.

Note: This function is not supported on web.

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.

Note: This transaction is not exclusive and can be interrupted by other async queries.

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

Returns:
void

attachAsync(table)

Android
iOS
macOS
tvOS
Web
ParameterTypeDescription
tablenull | string

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
tablenull | string

The table to attach.


Attach a table to the session synchronously.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

Returns:
void

createChangesetAsync()

Android
iOS
macOS
tvOS
Web

Create a changeset asynchronously.

createChangesetSync()

Android
iOS
macOS
tvOS
Web

Create a changeset synchronously.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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().

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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.

Note: While expo-sqlite will automatically finalize any orphaned prepared statements upon closing the database, it is considered best practice to manually finalize prepared statements as soon as they are no longer needed. This helps to prevent resource leaks. You can use the try...finally statement to ensure that prepared statements are finalized even if an error occurs.

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.

Note: While expo-sqlite will automatically finalize any orphaned prepared statements upon closing the database, it is considered best practice to manually finalize prepared statements as soon as they are no longer needed. This helps to prevent resource leaks. You can use the try...finally statement to ensure that prepared statements are finalized even if an error occurs.

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<null | string>

getItemAsync(key)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring

Retrieves the value associated with the given key asynchronously.

Returns:
Promise<null | string>

getItemSync(key)

Android
iOS
macOS
tvOS
Web
ParameterType
keystring

Retrieves the value associated with the given key synchronously.

Returns:
null | string

getKeyByIndexAsync(index)

Android
iOS
macOS
tvOS
Web
ParameterType
indexnumber

Retrieves the key at the given index asynchronously.

Returns:
Promise<null | string>

getKeyByIndexSync(index)

Android
iOS
macOS
tvOS
Web
ParameterType
indexnumber

Retrieves the key at the given index synchronously.

Returns:
null | string

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

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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.

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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.

Note: to enable this feature, you must set enableChangeListener to true when opening the database.

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<null | T>

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().

Note: Running heavy tasks with this function can block the JavaScript thread and affect performance.

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:
null | T

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 | Uint8Array

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[]