TinyBase 数据写入完全指南:Store 的 Values 与 Tables 写入、编码与删除机制
数据库后端前端【免费下载链接】tinybaseA reactive data store sync engine.项目地址https://gitcode.com/gh_mirrors/ti/tinybase点击查看免费下载TinyBase 是一个轻量级的响应式数据存储与同步引擎其核心 Store 承担着数据读写的全部职责。本指南围绕Writing To Stores主题系统讲解如何通过 setter 系列方法向 Store 写入两种形态的数据键值对 Values 与表格化数据 Tables深入剖析底层的数据类型编码规则包括UFFFD、UFFFC保留字符、隐式删除与空对象级联删除机制并结合仓库源码与测试用例给出可直接运行的实践示例。读完本文你将掌握 TinyBase 从粗粒度到细粒度的全套写入 API并能正确规避 JSON 编码陷阱。一、Store 的两类数据Values 与 Tables在 TinyBase 中一个 Store 内部只包含两种数据Values键值对由若干 Id/Value 对组成是扁平结构。例如{employees: 3, open: true}就包含两个 Value。Tables表格具有简单的三层层级结构Store 的 Tables 对象包含若干Table对象每个 Table 包含若干Row对象每个 Row 包含若干Cell对象。从源码结构看这两类数据在 Store 内部被分别维护为独立的 Map 结构valuesMap与tablesMap并通过统一的验证validate与事务transaction管线对外提供写入能力见 src/store/index.ts。创建 Store 只需要一行代码import {createStore} from tinybase; const store createStore();createStore在 src/store/index.ts#L266 中定义它返回一个 Store 实例随后即可调用下文所有写入方法。二、整体写入setValues 与 setTables对于刚创建的 Store最直接的写入方式是整体替换store.setValues({employees: 3, open: true}); store.setTables({pets: {fido: {species: dog}}});这两次调用分别将 Values 结构设置为两个键值对employees 3、open true将 Tables 结构设置为一个名为pets的 Table其中包含一个名为fido的 RowRow 内有一个名为species的 Cell值为字符串dog。验证结果可以立即通过 getter 读回console.log(store.getValues()); // - {employees: 3, open: true} console.log(store.getTables()); // - {pets: {fido: {species: dog}}}从实现上看setValues与setTables都会先克隆入参、再经过validateValues/validateTables的完整校验只有校验通过才会真正写入见 src/store/index.ts#L1844-L1848 与 src/store/index.ts#L1961-L1965。若写入内容非法例如包含无法序列化的值整个写入会被静默忽略Store 保持原状。三、细粒度写入setValue、setTable、setRow、setCell除了整体写入你还可以针对层级结构的任意一层做局部写入。所有 setter 均为链式fluent接口即每个方法返回 Store 本身可以连续调用。// 更新单个 Value将 employees 从 3 改为 4 store.setValue(employees, 4); console.log(store.getValues()); // - {employees: 4, open: true} // 新增一个名为 species 的 Table内含一行 dog store.setTable(species, {dog: {price: 5}}); console.log(store.getTables()); // - {pets: {fido: {species: dog}}, species: {dog: {price: 5}}} // 在 species 表中追加一行 cat store.setRow(species, cat, {price: 4}); console.log(store.getTables()); // - {pets: {fido: {species: dog}}, species: {dog: {price: 5}, cat: {price: 4}}} // 在 pets 表的 fido 行上添加一个 color Cell store.setCell(pets, fido, color, brown); console.log(store.getTables()); // - {pets: {fido: {species: dog, color: brown}}, species: {dog: {price: 5}, cat: {price: 4}}}各方法对应源码实现为setTablesrc/store/index.ts#L1850、setRowsrc/store/index.ts#L1858、setCellsrc/store/index.ts#L1901、setValuesrc/store/index.ts#L1977。值得注意的细节setRow、setCell在目标 Row 或 Table 不存在时会自动创建内部通过getOrCreateTable惰性建表因此你无需预先声明任何结构即可自由写入。四、数据类型与 JSON 编码规则4.1 基本类型一个 Value 或 Cell 的值可以是四种基本类型之一字符串string、数字number、布尔值boolean或null。4.2 对象与数组内部 JSON 编码更丰富的数据可以作为普通 JavaScript 对象或数组存入 Value / CellTinyBase 会在内部把它们编码为 JSON 字符串保存。这一行为在 src/common/cell.ts#L87-L90 的encodeIfJson中实现对象或数组会被加上一个内部前缀后以 JSON 字符串形式存储读取时再通过decodeIfJsonsrc/common/cell.ts#L98-L107还原。为了保证可靠的往返round trip编码对象和数组的内容应当递归地使用 JSON 兼容类型字符串、有限数字finite numbers、布尔值、null、普通对象和数组。TinyBase 会验证顶层对象或数组是否合法但其内部内容依赖JSON.stringify的行为jsonString即JSON.stringify见 src/common/json.ts#L6。这意味着嵌套的undefined值在对象中会被省略在数组中会变成null非有限数字如NaN、Infinity变成nullDate对象变成字符串BigInt与循环引用的结构无法序列化此时该 Cell 或 Value 非法写入会被静默忽略。4.3 保留字符UFFFD 与 UFFFC由于上述编码机制TinyBase 为 JSON 编码保留了特殊的内部前缀字符普通字符串数据必须避开UFFFDUnicode 替换字符作为对象/数组的内部编码前缀源码中定义为JSON_PREFIX见 src/common/strings.ts#L108。因此字符串 Cell / Value不能以UFFFD开头否则会被误判为编码后的 JSON。UFFFCUnicode 对象替换字符在序列化数据中表示undefined源码中定义为UNDEFINED见 src/common/strings.ts#L107。因此字符串 Cell / Value不能恰好等于UFFFC。以这两个字符开头或等于其值的字符串属于非法数据写入会被静默忽略。但有以下例外UFFFD可以出现在字符串的其他位置非开头包含UFFFC的更长字符串是允许的在对象/数组内部嵌套的字符串中这两个字符都可以正常使用。保留字符的判定由isReservedString完成src/common/cell.ts#L95-L96并在validateRow/validateValue等校验链路中被强制执行单元测试 test/unit/core/store/mergeable-store.test.ts#L733-L748 也验证了 Store 会拒绝以\uFFFD{}或\uFFFC开头的保留字符串写入。五、两个特殊的 Row 操作方法addRow 与 setPartialRow除了标准的 setterTinyBase 还提供了两个高频实用的 Row 操作方法addRow(tableId, row)与setRow类似但会自动为新 Row 分配一个唯一的新 Id并返回该 Id。若 Row 数据非法则返回undefined。从源码看Id 由getNewRowId配合表级 Id 池生成且会循环检查以确保不与现有 Row 冲突src/store/index.ts#L1101-L1108它还支持可选的第三个参数reuseRowIds默认true用于控制是否复用已被删除的 Id。setPartialRow(tableId, rowId, partialRow)只更新 Row 中指定的多个 Cell不影响其他已有 Cell。与之对应setPartialValues对 Values 做同样的局部合并更新。// addRow自动生成新 Row Id const newRowId store.addRow(species, {price: 6}); // newRowId 形如 r3 之类的唯一 Id且该 Row 已写入 // setPartialRow只更新部分 Cell其余保留 store.setPartialRow(pets, fido, {color: black}); // fido 行原有的 species 不受影响color 被更新从实现上看setPartialRow会对传入的每个 Cell 单独执行写入src/store/index.ts#L1886-L1899因此天然支持只改一部分的语义相关行为在 test/unit/core/other/checkpoints.test.ts#L41-L42 中也有使用示例。六、删除数据专用方法与隐式删除6.1 专用删除方法针对层级的每一层TinyBase 都提供了对应的删除方法delValue、delTable、delRow、delCell。store.delValue(employees); console.log(store.getValues()); // - {open: true} store.delTable(species); console.log(store.getTables()); // - {pets: {fido: {species: dog, color: brown}}}删除操作的底层实现src/store/index.ts#L2131-L2158会触发相应的 Cell/Row/Table 变更通知保持 Store 的响应式特性。6.2 隐式删除set 一个更小的对象当你用 setter 设置的对象比之前少了某些键时缺失的部分会被隐式删除。例如console.log(store.getTables()); // - {pets: {fido: {species: dog, color: brown}}} store.setRow(pets, fido, {species: dog}); console.log(store.getTables()); // - {pets: {fido: {species: dog}}} // 原来的 color Cell 已被删除也就是说整体替换语义同时作用于结构和内容set 的对象就是最终状态未包含的键都会被清除。6.3 空对象的级联删除Table 和 Row 对象不能为空——如果它们变空会被自动移除并引发级联效应当你删除某父对象的最后一个子对象时父对象会被递归删除。store.delCell(pets, fido, species); console.log(store.getTables()); // - {} // fido Row 和 pets Table 均被递归删除这一级联逻辑在 src/store/index.ts#L1144-L1176 的delValidCell中实现删除最后一个 Cell 后若 Row 变空则删除 Row若 Table 随之变空则继续删除 Table并同步清理该表关联的 Id 池与 Cell Id 索引。七、写入的底层保障验证管线与 fluent 事务从源码可以提炼出所有写入方法的统一执行模式src/store/index.ts克隆写入前先clone入参避免外部对象被内部引用后意外篡改验证通过validateTables/validateTable/validateRow/validateValuessrc/store/index.ts#L507-L617逐层校验类型合法性与保留字符约束非法即整体放弃写入编码对象/数组经encodeIfJson转为带前缀的 JSON 字符串后落库事务所有写入包裹在fluentTransaction中保证多步操作原子性并返回 Store 以支持链式调用。此外Store 还预留了willSet*/willDel*系列中间件钩子定义于 src/store/index.ts#L275-L290可在写入/删除前拦截并改写数据这为需要校验或审计的业务场景提供了扩展点。总结本指南覆盖了 TinyBase 向 Store 写入数据的完整方法论从setValues/setTables的整体写入到setValue/setTable/setRow/setCell的细粒度写入再到addRow、setPartialRow、setPartialValues的便捷操作同时厘清了对象与数组的内部 JSON 编码规则、UFFFD/UFFFC保留字符边界以及专用删除、隐式删除与空对象级联删除三大删除机制。数据写进去之后自然还要读出来——本文示例中已经用到的getValues与getTables只是开始。关于更细粒度的读取方法如getValue、getTable、getRow、getCell请继续阅读仓库中的下一篇指南 Reading From Stores。赞分享数据库后端前端【免费下载链接】tinybaseA reactive data store sync engine.项目地址https://gitcode.com/gh_mirrors/ti/tinybase点击查看免费下载相关推荐pypdf PDF 元数据完全指南Document Info 与 XMP 的读取、写入、更新与删除pypdf PDF 元数据完全指南Document Info 与 XMP 的读取、写入、更新与删除 本文系统讲解 pypdf 中处理 PDF 元数据的全部能力后端TDengine 数据删除DELETE完全指南语法、删除标记机制与 SECURE_DELETE 安全删除TDengine 数据删除DELETE完全指南语法、删除标记机制与 SECURE_DELETE 安全删除 DELETE 语句是 TDengine 中按时间数据库时序数据库物联网大数据实时分析云原生AngularFire Realtime Database 列表数据实战指南AngularFireList 的读取、写入与删除全解析AngularFire Realtime Database 列表数据实战指南AngularFireList 的读取、写入与删除全解析 本篇指南以 Angula后端上一篇探索技术之美Obsidian 主题 Maple - 打造个性化知识管理体验下一篇SmolVLA SO101 PickOrange首个开源视觉语言行动机器人模型让机械臂精准完成橙子分拣任务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

VB.NET WinForms实战:Excel数据读取、去重与Listbox绑定全解析

VB.NET WinForms实战:Excel数据读取、去重与Listbox绑定全解析

1. 从Excel到Listbox:一个看似简单却暗藏玄机的需求做过WinForms桌面开发的人,几乎都绕不开一个经典场景:用户手里有一份Excel表格,想把其中某一列的数据读出来,塞进界面上的Listbox控件里,而且还要自动去掉…

2026/10/13 1:39:10 阅读更多 →
AnyPS5跨平台串流实战:低延迟游戏串流架构与优化指南

AnyPS5跨平台串流实战:低延迟游戏串流架构与优化指南

1. 从“AnyPS5”这个标题说起:一个跨平台串流工具的设计野心第一次看到“AnyPS5”这个命名,我的直觉是:这大概率是一个围绕主机游戏串流展开的跨平台工具项目。名字里的“Any”是核心——它暗示的不是单一平台、单一设备,而是“任…

2026/10/13 1:39:10 阅读更多 →
VirtualBox虚拟机与主机互通,并且虚拟机又能上网

VirtualBox虚拟机与主机互通,并且虚拟机又能上网

## 四种网络模式1、NAT 网络地址转换模式(NAT,Network Address Translation) 2、Bridged Adapter 桥接模式 3、Internal 内部网络模式 4、Host-only Adapter 主机模式 版本一:## 设置1、关闭虚拟机,VirtualBox->偏好设置->网络NAT网络,…

2026/10/13 1:38:10 阅读更多 →

最新新闻

Reclilisib:从PI3K激动剂到选择性辐射保护剂的双重角色

Reclilisib:从PI3K激动剂到选择性辐射保护剂的双重角色

做肿瘤放疗研究的朋友应该都有过这种纠结:治疗窗口太窄,射线过去,肿瘤细胞和正常组织一起遭殃。我们这些年一直在找"选择性辐射保护剂"——最好能保护正常细胞,却不给肿瘤细胞留活路。我第一次注意到Reclilisib&#xf…

2026/10/13 2:18:27 阅读更多 →
MFC连接MySQL实战:ODBC封装、CRUD与避坑手册

MFC连接MySQL实战:ODBC封装、CRUD与避坑手册

简介:这是一套面向MFC桌面应用开发者的MySQL数据库访问示例工程,核心演示如何借助ODBC标准数据库接口,在C程序中完成连接建立、SQL查询、结果集遍历与数据更新等常用操作。压缩包内共含117个文件,压缩后约181KB;其中49…

2026/10/13 2:18:27 阅读更多 →
从Java转运营第5天:用技术思维做抖音新号,先学会拆解对标账号

从Java转运营第5天:用技术思维做抖音新号,先学会拆解对标账号

今天是我从 Java 转运营的第 5 天,也是正式开始折腾抖音新号起号的日子。说实话,从写完第一版账号简介到研究“到底该发什么”,我踩的坑比写的需求还多。如果把起号比作一次系统上线,那我 Day05 最大的收获就是:先别急…

2026/10/13 2:18:27 阅读更多 →
安卓手机跑 Windows 应用完整指南:Winlator 安装、配置与排障实操

安卓手机跑 Windows 应用完整指南:Winlator 安装、配置与排障实操

安卓手机跑 Windows 应用完整指南:Winlator 安装、配置与排障实操 【免费下载链接】winlator Android application for running Windows applications with Wine and Box86/Box64 项目地址: https://gitcode.com/GitHub_Trending/wi/winlator 手机里下了个 .…

2026/10/13 2:18:27 阅读更多 →
eksctl v0.149.0 发布解析:AWS 区域环境变量修复与 eksctl-io 组织迁移

eksctl v0.149.0 发布解析:AWS 区域环境变量修复与 eksctl-io 组织迁移

云原生容器编排DevOps 【免费下载链接】eksctl The official CLI for Amazon EKS 项目地址: https://gitcode.com/gh_mirrors/ek/eksctl 点击查看 免费下载 本指南围绕 eksctl 官方 CLI 的 v0.149.0 发布说明展开,逐项解析该版本引入的功能更新、两个关…

2026/10/13 2:18:27 阅读更多 →
Win11升级后应用打不开?从升级机制到修复方案全解析

Win11升级后应用打不开?从升级机制到修复方案全解析

最近一段时间,我这边处理最多的求助不是软件本身崩溃,而是同一句话:升完 Win11 之后,XX 应用打不开了。有的是设备厂商的配置工具,点开就没反应;有的是行业软件启动后直接闪退;还有的是虚拟机一…

2026/10/13 2:17:27 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →