expo-sqlite
expo-sqlite
开放Beta测试文档 作为预发布开放Beta测试的一项内容,亚马逊提供了此技术文档。随着亚马逊收到反馈并对功能进行迭代,所描述的这些功能可能会发生变化。有关最新功能的信息,请参阅发布说明。
@amazon-devices/expo-sqlite让您的应用可以访问数据库,该数据库可以通过类似WebSQL的API进行查询。该数据库在应用重启后保持不变。
安装
- 在
package.json文件中添加JavaScript库依赖项。dependencies: { ... "@amazon-devices/expo-sqlite": "~2.0.0", "@amazon-devices/keplerscript-turbomodule-api": "~1.0.0", "expo": "~50.0.0", ... } - 使用
npm install命令重新安装依赖项,并使用kepler build命令重新构建应用。
示例
以下是一个全面的示例,显示了典型应用中的完整数据库操作流程。
import {openDatabase, SQLResultSet} from '@amazon-devices/expo-sqlite';
import React, {useEffect, useState} from 'react';
import {Button, StyleSheet, Text, View} from 'react-native';
let db = openDatabase('database.db');
export const App = () => {
const [rows, setRows] = useState<any[][]>([]);
const [dbClosed, setDbClosed] = useState(false);
// 创建数据库
useEffect(() => {
db.transaction((tx) => {
tx.executeSql(
'create table if not exists items (id integer primary key not null, done int, value text, floating double, int integer);',
);
});
}, []);
const handleSelectResult = (result: SQLResultSet) => {
if (result.rows.length > 0) {
const columnNames = Object.keys(result.rows._array[0]);
const allRows = result.rows._array.map(Object.values);
setRows([columnNames, ...allRows]);
} else {
setRows([]);
}
};
// 打开数据库
const openDb = () => {
db = openDatabase('database.db');
db.transaction((tx) => {
tx.executeSql(
'create table if not exists items (id integer primary key not null, done int, value text, floating double, int integer);',
);
});
setDbClosed(false);
};
// 同步关闭数据库
const closeDbSync = () => {
db.closeSync();
setDbClosed(true);
};
// 异步关闭数据库
const closeDbAsync = async () => {
await db.closeAsync();
setDbClosed(true);
};
// 同步执行插入操作
const transactionSync = () => {
db.transaction((tx) => {
const done = Math.round(Math.random());
const value = 'text-' + Date.now().toString().slice(-4);
const float = Number((Math.random() * 10).toFixed(2));
const int = Math.round(Math.random() * 1000);
tx.executeSql(
'insert into items (done, value, floating, int) values (?, ?, ?, ?)',
[done, value, float, int],
() => {},
);
});
};
// 异步执行删除操作
const transactionAsync = async () => {
await db.transactionAsync(async (tx) => {
await tx.executeSqlAsync(
'delete from items where id = (select max(id) from items)',
);
});
};
// 同步执行选择交易
const readTransactionSync = () => {
db.readTransaction((tx) => {
tx.executeSql('select * from items', [], (_, result) =>
handleSelectResult(result),
);
});
};
// 删除数据库
const deleteDb = () => {
db.deleteAsync();
};
return (
<View style={styles.container}>
<View style={styles.sideColumn}>
<Button title="open" onPress={openDb} disabled={!dbClosed} />
<Button title="close sync" onPress={closeDbSync} disabled={dbClosed} />
<Button
title="关闭同步"
onPress={closeDbAsync}
disabled={dbClosed}
/>
<Button
title="交易同步(插入)"
onPress={transactionSync}
disabled={dbClosed}
/>
<Button
title="交易异步(删除)"
onPress={transactionAsync}
disabled={dbClosed}
/>
<Button
title="读取交易同步(选择)"
onPress={readTransactionSync}
disabled={dbClosed}
/>
<Button
title="删除数据库"
onPress={deleteDb}
disabled={!dbClosed}
/>
</View>
<View style={styles.mainColumn}>
<Text style={styles.label}>Database version: {db.version}</Text>
<Text style={styles.label}>Database open: {String(!dbClosed)}</Text>
<View style={styles.table}>
{rows.map((row) => (
<View style={styles.row}>
{row.map((col) => (
<View style={styles.cell}>
<Text style={styles.cellText}>{String(col)}</Text>
</View>
))}
</View>
))}
</View>
</View>
</View>
);
};
const styles = StyleSheet.create({
scrollView: {
flex: 1,
},
container: {
flex: 1,
backgroundColor: 'white',
flexDirection: 'row',
padding: 20,
},
sideColumn: {
flex: 1,
flexDirection: 'column',
padding: 10,
},
mainColumn: {
flex: 2,
flexDirection: 'column',
padding: 10,
},
label: {
color: 'black',
fontSize: 32,
flexDirection: 'column',
},
table: {
alignItems: 'center',
justifyContent: 'center',
},
row: {
flexDirection: 'row',
height: 40,
},
cell: {
flex: 1,
borderColor: 'black',
borderWidth: 1,
alignItems: 'center',
justifyContent: 'center',
},
cellText: {
color: 'black',
fontSize: 20,
},
});
API参考
请参阅官方Expo文档(仅提供英文版)。
类
| 类 | 描述 |
|---|---|
ExpoSQLTransactionAsync |
异步事务API的内部数据结构 |
SQLError |
用于处理与数据库操作相关的错误的类 |
SQLiteDatabase |
openDatabase() 返回的数据库 |
SQLError属性
| 属性 | 描述 |
|---|---|
code |
错误代码 |
message |
错误消息 |
CONSTRAINT_ERR |
此错误代码表示违反了约束条件 |
DATABASE_ERR |
此错误代码表示发生了与数据库有关的一般错误 |
SYNTAX_ERR |
此错误代码表示SQL语句中存在语法错误 |
TOO_LARGE_ERR |
此错误代码表示正在处理的数据太大而无法处理 |
UNKNOWN_ERR |
此错误代码表示发生了未知或意外错误 |
VERSION_ERR |
此错误代码表示SQLite数据库版本与@amazon-devices/expo-sqlite需要的版本之间存在兼容性问题 |
SQLiteDatabase属性
| 属性 | 描述 |
|---|---|
close |
可用于关闭数据库的方法。警告: 此方法已弃用,应当改用closeAsync() |
version |
数据库的当前版本 |
SQLiteDatabase方法
| 方法 | 描述 |
|---|---|
closeAsync |
关闭数据库 |
deleteAsync |
删除数据库文件。必须先关闭数据库,然后才能删除 |
exec |
执行SQL语句并返回一个回调解析及结果 |
execAsync |
执行SQL语句并返回一个Promise解析及结果 |
readTransaction |
确保数据库在事务期间处于锁定状态,只能读取 |
transaction |
执行数据库事务 |
transactionAsync |
利用Promise支持创建新事务 |
方法
| 方法 | 描述 |
|---|---|
openDatabase |
打开一个数据库,如果不存在则创建数据库,然后返回一个Database对象。在磁盘上,数据库将在应用的文档目录下创建,即${FileSystem.documentDirectory}/SQLite/${name} |
支持的版本
| 程序包版本 | 基于 | @amazon-devices/react-native-kepler版本 |
|---|---|---|
| 2.0.x | 11.8.0 | 2.0.x |
其他资源
有关其他库的信息,请参阅支持的第三方库和服务。
Last updated: 2025年9月30日

