@baukit/data-contracts-expo-sqlite

中文文档
0.18.3发布于 2026/11/07MITTypeScriptES Module零依赖构建来源已验证近 30 天下载 8248

Expo SQLite 执行@baukit/data-contracts 基础存储合同.

中文使用文档
文档目录5 节
  1. 操作命令
  2. 原始 SQL 连接
  3. 节点测试
  4. 移徙人员合规情况
  5. 边界

@baukit/data-contracts-expo-sqlite

执行零产品-逻辑博览会SQLite @baukit/data-contracts' 基本储存合同.

import { SqliteRecordStore } from '@baukit/data-contracts-expo-sqlite';
import * as SQLite from 'expo-sqlite';

interface CachedRecord {
  readonly id: string;
  readonly value: string;
}

const database = await SQLite.openDatabaseAsync('product.db');
const records = new SqliteRecordStore<CachedRecord>(database, 'cached-records');
await records.initialize();

对于关键数据/值数据,计划元数据和原子复合物写作,请使用 复合适配器:

import { ExpoSqliteStore } from '@baukit/data-contracts-expo-sqlite';

const storage = new ExpoSqliteStore<CachedRecord>(database, 'product');
await storage.initialize();
await storage.withTransaction((transaction) =>
  transaction.withTransaction((sameTransaction) =>
    sameTransaction.records.put({ id: 'one', value: 'cached' }),
  ),
);

对交易范围上下文的暗中呼叫加入环境专属 交易. close() 关闭逻辑适配器; 通过 { closeDatabase: true } 当它也拥有所提供的数据库手柄时.

命名空间共享一个固定 baukit_records 桌子没有相撞。 打电话 initialize() 在使用商店之前。 记录是按JSON顺序排列的,标注是受约束的并基于密钥集的,而有缺陷的持久有效载荷会产生无内容的错误.

操作命令

Expo SQLite 运行 withExclusiveTransactionAsync 连接到 同一个文件。 在交易运行时的基控上声明 打开失败 database is locked因此,适配器运行根读取, 根写出, initialize(), (中文(简体) ), withTransaction(),以及 close() 一次一个, 按呼叫顺序,每个数据库文件一个队列(SQLiteDatabase.databasePath) (中文(简体) ). 每个 ExpoSqliteStore, (中文(简体) ), SqliteRecordStore, (中文(简体) ), SqliteKeyValueStore,以及 SqliteSchemaMetadataStore 在该文件中共享队列, 以控件和 它使用的命名空间。 不同文件中的存储不相等 .

  • 交易上下文的工作运行在交易连接上,从未 输入队列.
  • 一个被拒绝的操作会释放下一个呼叫者的队列 .
  • close() 拒绝新电话 storage_closed,等待工作已经 被接受, 关闭自有控件一次, 并返回同样的承诺 包括一个被拒绝的人.
  • SQLite 的锁定错误未更改联系人 。 适配器从不重复.

内部a withTransaction 调回,请使用它传递的上下文。 根调用 在交易后面的相同文件队列上, 交易 等待那个电话, 和两个结束。 保持网络和文件工作 召回,因为它为文件的每个商店排队。 原始内容 语句中,一个产品运行在手柄上本身绕过队列。 运行他们 结束 ExpoSqliteConnection 换句话说.

套装的快速Vitest套装 运行共享合同 对抗决定主义 数据库伪造和反对 NodeSqliteDatabase (见下文)。 这个 Expo SQLite 设备兼容应用程序 反映对实际合同的共享合同案例 expo-sqlite 在安卓上, 包括创建/重新打开、命名空间隔离、数据畸形、回滚、, schema-metadata 升级, 根与交易在两个到达时重叠 命令, ExpoSqliteConnection 命令、 外国密钥和回滚 ExpoSqliteStore,并认证E F E数据库隔离。 产品 生成数据库名称并用 @baukit/data-contracts 在打开博览会数据库之前。 iOS是一个预定/手动macOS门.

原始 SQL 连接

ExpoSqliteConnection 运行产品自己的SQL,例如关系计划 和它的迁移跑者, 与上面的仓库相同.

import { ExpoSqliteConnection } from '@baukit/data-contracts-expo-sqlite';

const connection = new ExpoSqliteConnection(database);
await connection.exec('CREATE TABLE IF NOT EXISTS notes (id TEXT PRIMARY KEY, body TEXT)');
await connection.transaction(async (transaction) => {
  await transaction.run('INSERT INTO notes (id, body) VALUES (?, ?)', 'one', 'first');
  return transaction.get<{ readonly body: string }>('SELECT body FROM notes WHERE id = ?', 'one');
});
  • exec(source) 运行一个没有参数的脚本. run, (中文(简体) ), get,以及 all 绑定参数为 expo-sqlite 是: 变量值, 一个数组, 或者一个 其密钥保存对象 $, (中文(简体) ), :,或 @ 前缀. run 决定: { changes, lastInsertRowId }, (中文(简体) ), get 转到第一行或 undefined,以及 all 给每一行.
  • 每根语句, transaction(),以及 close() 等待它打开 队列显示同一数据库文件共享的每个商店。 根语句 当交易打开时,另一个呼叫者会发出 交易承诺或退缩, 永远不会在里面.
  • transaction(work) 运行 BEGIN IMMEDIATE 在提供的手柄上,承诺 何时 work 决心,当 work 或拒绝犯罪。 这个 原始错误到达呼叫器时没有改变,结果为: work 实值 已经返回.
  • 交易上下文有相同的声明方法. 之后 交易结算,其报表以 storage_closed。 。 。 .
  • 环境 transaction(work) 巢: 它运行 SAVEPOINT 同样的 手柄不等待队列,所以它永远不会陷入僵局 包含队列的交易。 它释放出保存点时 work 解决并返回结果。 何时 work 拒绝,它滚回 保存点,只撤销嵌入式语句和计划变化,以及 以同样的错误拒绝。 除非 呼叫者发现了这个错误。 释放的巢穴活儿仍然会卷回 附加关卡失败 。 尼斯廷没有深度限制.
  • 只有内心最开放的关卡接受工作. 虽然一个嵌入式交易 开放、发言和发言 transaction() 附加上下文时以 TypeError,所以运行兄弟关系 巢交易一个接一个,而不是与 Promise.all。 。 。 .
  • 连接运行 PRAGMA foreign_keys = ON 放在手柄上 第一次声明。 因为交易运行在那个手柄, 外国钥匙和 ON DELETE 行动在他们内部执行。 一个必须重建 表格仍然可以运行 PRAGMA foreign_keys = OFF 作为前面的根语句 它的交易,然后恢复它.
  • close() 拒绝新电话 storage_closed等待被认可的工作, 并仅关闭控件 { closeDatabase: true }。 。 。 .
  • SQLite 错误,包括 database is locked,通过不变,和 没有重复.

连接不使用 withExclusiveTransactionAsync。博览会运行 BEGIN 在调用任务前新建连接, SQLite 忽略 PRAGMA foreign_keys 在交易中,所以第二个连接会离开 外国钥匙关了 没法打开.

同样的僵局规则与 withTransaction 应用: 内 work,使用 交易上下文,并通过其嵌入 transaction()。对 连接或任何商店,用于交易后相同的文件队列 从来没有完成.

输入的帮助对象 Pick<SqliteTransaction, 'transaction'> 接受两者 连接和交易上下文,从而打开寄存器方法 其自己的交易在根部单独进行,或作为呼叫者内部的保存点 交易.

这与 ExpoSqliteStore.withTransaction他们的巢中呼唤 按照共享存储合同的要求进行环境交易.

节点测试

@baukit/data-contracts-expo-sqlite/testing 在节点单位中运行 Expo SQLite 代码 在节点的内置测试(Vites或Jest) node:sqlite它需要节点24或 以后不增加依赖性.

import { ExpoSqliteStore } from '@baukit/data-contracts-expo-sqlite';
import { NodeSqliteDatabase } from '@baukit/data-contracts-expo-sqlite/testing';

const database = new NodeSqliteDatabase();
const storage = new ExpoSqliteStore<CachedRecord>(database, 'product', { closeDatabase: true });
await storage.initialize();

NodeSqliteDatabase 执行 ExpoSqliteDatabase, 博览会的部分 SQLiteDatabase 这个适配器呼叫: databasePath, (中文(简体) ), execAsync, (中文(简体) ), runAsync, (中文(简体) ), getFirstAsync, (中文(简体) ), getAllAsync, (中文(简体) ), withExclusiveTransactionAsync,以及 closeAsync。对照这些方法输入的产品驱动程序接受该方法而不使用 铸出。 没有参数, 它打开一个新的临时文件并删除它 closeAsync()。有了路径,它打开了文件,就放在原地,所以测试一下 可关闭和重开同一数据库. :memory: 丢出一个 TypeError,因为 独家交易必须打开与同一数据库的第二个连接.

它复制了产品测试倾向于隐藏的设备行为:

  • withExclusiveTransactionAsync 运行 BEGIN,任务,和 COMMIT 一个新的 连接到同一文件,并在任务抛出时返回。 写信 打开交易时的根控点失败 database is locked。 。 。 .
  • 每条连接都会打开外国的密钥. PRAGMA foreign_keys = ON 打开 根控点没有到达交易连接.
  • 布尔和整数作为整数结合, undefined 绑定为 NULL,并 已命名参数需要其 $, (中文(简体) ), :,或 @ 前缀.
  • 行为平地物体,和 getFirstAsync 返回时 null 没有排行.

它与装置在三个地方不同. 未知的命名参数或 额外位置值抛出而不是被忽略。 根读取时 打开交易成功并查看承诺状态。 外的整数 安全射程抛出。 没有 withTransactionAsync, (中文(简体) ), prepareAsync,或 同步方法.

变革的最佳项目 @baukit/* 通过 Babel 解析条目 联合国 default 条件.

移徙人员合规情况

createSqliteMigrationConformanceTests(adapter) 返回框架中和大小写 一个产品自己的SQLite迁移跑者。 每个人通过测试注册 运行 :

import {
  createSqliteMigrationConformanceTests,
  type SqliteMigrationConformanceAdapter,
} from '@baukit/data-contracts-expo-sqlite/testing';

const adapter: SqliteMigrationConformanceAdapter = {
  migrate: (database, steps) => runMigrations(new ProductSqliteDriver(database), steps),
};

for (const testCase of createSqliteMigrationConformanceTests(adapter)) {
  it(testCase.name, testCase.run);
}

migrate 收到一个 NodeSqliteDatabase 和清单 { version, name, sql } 步骤,一个应用程序建造船只的完整列表。 这个 当运行者失败或拒绝数据库时,必须拒绝。 案件核实 跑者:

  • 将每个步骤应用到新的数据库;
  • 更新旧的数据库并保持其行;
  • 重新启动后不再应用;
  • 完全滚回一个失败的步骤, 没有表或栏从早先的 遗留的语句,并应用重启后的固定步骤;
  • 拒绝新建的数据库迁移,使其保持不变.

该套房不读跑者的历史表或 user_version,所以没有 记录版本的跑步者 某处通过。 一个步骤 sql 持有若干 语句,所以执行者必须执行它作为脚本(execAsync) (中文(简体) ). 每个案件 使用自己的临时文件。 失败的大小写会丢出一个开始的错误 SQLite migration conformance failed: 并点出破碎的期望.

边界

软件包执行 @baukit/data-contracts 在博览会SQLite上,没有别的。 它不选择一个 数据库名称,打开单通,定义产品实体,或执行缓存政策.

通过数据库的手柄而不是打开手柄,使认证的产品能够 获得每个身份的数据库名称,这是共享的E-F-E隔离案例.

@baukit/data-contracts-dexie 在网络上是同一个合同.

版本与发布记录

@baukit/data-contracts-expo-sqlite 共发布 67 个版本,首次发布于 2026/08/26;过去 12 个月发布了 67 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.18.3latest2026/11/07今天
0.18.22026/11/061 天前
0.18.12026/11/062 天前
0.18.02026/11/052 天前
0.17.12026/11/034 天前
0.17.02026/11/025 天前

关于 @baukit/data-contracts-expo-sqlite 的常见问题

@baukit/data-contracts-expo-sqlite 是什么?

Expo SQLite 执行@baukit/data-contracts 基础存储合同.

如何安装 @baukit/data-contracts-expo-sqlite?

在项目目录运行 npm install @baukit/data-contracts-expo-sqlite,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:expo-sqlite(^57.0.3)、@baukit/data-contracts(^0.18.3)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@baukit/data-contracts-expo-sqlite 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@baukit/data-contracts-expo-sqlite 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@baukit/data-contracts-expo-sqlite 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=24.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@baukit/data-contracts-expo-sqlite 可以商用吗?

@baukit/data-contracts-expo-sqlite 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@baukit/data-contracts-expo-sqlite 的下载量有多少?

根据 npm 官方下载统计,@baukit/data-contracts-expo-sqlite 在 2026/10/08 – 2026/11/06 这 30 天内被下载 8,248 次,日均约 275 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@baukit/data-contracts-expo-sqlite 还在维护吗?

最新版本 0.18.3 发布于 2026/11/07(今天);至今共发布 67 个版本,其中过去 12 个月发布了 67 个;首次发布于 2026/08/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。