数据库后端前端【免费下载链接】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),仅供参考