App Inventor 2 网络微数据库(TinyWebDB)保姆级教程

本文从零开始讲解网络微数据库的用法,适合完全没有网络数据库经验的初学者。

一、为什么需要网络微数据库?

场景本地微数据库网络微数据库
数据只存本机✅ 够用不需要
多台手机共享数据❌ 不支持✅ 支持
多用户注册登录❌ 不支持✅ 支持
换手机数据不丢失❌ 会丢失✅ 不丢失
实时同步数据❌ 不支持✅ 支持
结论:只要涉及多用户、多设备、数据共享,就需要网络微数据库。

二、网络微数据库 vs 其他数据库方案

方案难度适用场景
网络微数据库(TinyWebDB)⭐ 最简单小型数据,用户量少
云数据库(CloudDB)⭐⭐需要实时推送
Firebase⭐⭐⭐需要科学上网
LeanDB⭐⭐⭐国内大型项目
MySQL+PHP⭐⭐⭐⭐自建服务器
初学者首选网络微数据库,用法最简单,上手最快。

三、网络微数据库核心概念

3.1 标签(Tag)和值(Value)

网络微数据库是一个**键值对(Key-Value)**存储系统:
  • 标签(Tag):相当于”钥匙”,用来找到对应的数据
  • 值(Value):相当于”内容”,可以是文字、数字、列表、字典
标签 "username_张三" → 值 {"密码":"123456", "邮箱":"zhangsan@qq.com"}
标签 "userlist"      → 值 ["张三", "李四", "王五"]
标签 "score_张三"    → 值 95

3.2 ⚠️ 最重要:异步操作

网络微数据库和本地微数据库最大的区别:所有操作都是异步的!
  • 本地微数据库:存完立刻能读,同步操作
  • 网络微数据库:存/读都需要等待网络响应,异步操作
什么是异步?
你发了一条微信,不会傻等对方回复,而是继续做其他事。等对方回复了,手机会通知你。这就是异步。
网络微数据库也一样:
  • 调用”获取值”后,不会立刻得到结果
  • 需要在**“已获得值时”事件**中处理结果
  • 调用”存储值”后,不会立刻确认成功
  • 需要在**“值存储完毕时”事件**中确认

四、核心方法和事件

4.1 方法

方法参数说明
获取值(GetValue)标签, 无标签时的值从网络读取数据
存储值(StoreValue)标签, 值向网络写入数据

4.2 事件

事件参数触发时机
已获得值时(GotValue)标签, 值获取值成功后触发
值存储完毕时(ValueStored)存储值成功后触发
网络错误时(WebServiceError)消息网络出错时触发

4.3 属性

属性说明默认值
服务地址(ServiceURL)数据库服务器地址MIT官方服务器(国外,慢)
重要:MIT官方服务器在国外,速度慢且不支持中文。正式项目请使用国内服务器,参考:网络微数据库你用对了吗?

五、入门案例:存储和读取一个值

界面设计

  • 文本输入框:输入要存储的内容
  • 按钮1:存储
  • 按钮2:读取
  • 标签:显示读取结果
  • 网络微数据库组件(不可见)

代码块

// 存储
当 按钮1.被点击 时
  调用 网络微数据库1.存储值
    标签 = "my_data"
    值 = 文本输入框1.文本

当 网络微数据库1.值存储完毕时
  调用 对话框1.显示消息对话框("存储成功!", "提示", "确定")

// 读取
当 按钮2.被点击 时
  调用 网络微数据库1.获取值
    标签 = "my_data"
    无标签时的值 = "暂无数据"

当 网络微数据库1.已获得值时(标签, 值)
  设置 标签1.文本 = 值

// 错误处理
当 网络微数据库1.网络错误时(消息)
  调用 对话框1.显示消息对话框(合并字符串("网络错误:", 消息), "错误", "确定")

⚠️ 常见错误

错误写法(同步思维):
调用 网络微数据库1.获取值("my_data", "")
设置 标签1.文本 = 网络微数据库1.???  // 这里拿不到值!
正确写法(异步思维):
// 先发起请求
调用 网络微数据库1.获取值("my_data", "")

// 在事件中处理结果
当 网络微数据库1.已获得值时(标签, 值)
  设置 标签1.文本 = 值

六、进阶案例:多标签区分

当需要读取多种数据时,用标签参数区分:
// 屏幕初始化时,同时请求多个数据
当 Screen1.初始化 时
  调用 网络微数据库1.获取值("用户名", "")
  调用 网络微数据库1.获取值("积分", "0")
  调用 网络微数据库1.获取值("等级", "1")

// 在事件中根据标签分别处理
当 网络微数据库1.已获得值时(标签, 值)
  如果 标签 = "用户名" 则
    设置 标签_用户名.文本 = 值
  否则如果 标签 = "积分" 则
    设置 标签_积分.文本 = 合并字符串("积分:", 值)
  否则如果 标签 = "等级" 则
    设置 标签_等级.文本 = 合并字符串("等级:", 值)

七、实战案例:多用户注册登录

设计思路

用两类标签存储用户数据:
  • userlist → 存储所有用户名列表(如:["张三","李四","王五"]
  • user_张三 → 存储张三的详细信息(如:{"密码":"123456","邮箱":"..."}
这样设计的好处:
  • 可以快速查询用户是否存在(查 userlist)
  • 每个用户数据独立存储,不超过大小限制

注册流程

初始化全局变量 用户列表 = []

// 屏幕初始化:先加载用户列表
当 Screen1.初始化 时
  调用 网络微数据库1.获取值("userlist", [])

当 网络微数据库1.已获得值时(标签, 值)
  如果 标签 = "userlist" 则
    设置 全局变量 用户列表 = 值

// 注册按钮
当 按钮_注册.被点击 时
  初始化局部变量 用户名 = 文本输入框_用户名.文本
  初始化局部变量 密码 = 文本输入框_密码.文本
  
  // 检查用户名是否已存在
  如果 检查列表中是否包含对象(用户名, 全局变量 用户列表) 则
    调用 对话框1.显示消息对话框("用户名已存在!", "提示", "确定")
  否则
    // 添加到用户列表
    调用 追加列表项(全局变量 用户列表, 用户名)
    // 存储用户列表
    调用 网络微数据库1.存储值("userlist", 全局变量 用户列表)
    // 存储用户详细信息
    调用 网络微数据库1.存储值(
      合并字符串("user_", 用户名),
      创建字典(["密码", 密码])
    )

当 网络微数据库1.值存储完毕时
  调用 对话框1.显示消息对话框("注册成功!", "提示", "确定")

登录流程

当 按钮_登录.被点击 时
  初始化局部变量 用户名 = 文本输入框_用户名.文本
  
  // 先检查用户是否存在
  如果 检查列表中是否包含对象(用户名, 全局变量 用户列表) 则
    // 存在则获取用户信息
    调用 网络微数据库1.获取值(合并字符串("user_", 用户名), {})
    设置 全局变量 当前登录用户 = 用户名
  否则
    调用 对话框1.显示消息对话框("用户不存在!", "提示", "确定")

当 网络微数据库1.已获得值时(标签, 值)
  如果 以 "user_" 开头(标签) 则
    // 验证密码
    如果 获取键的值(值, "密码") = 文本输入框_密码.文本 则
      调用 对话框1.显示消息对话框("登录成功!", "提示", "确定")
      // 跳转到主界面
      调用 打开另一屏幕("MainScreen")
    否则
      调用 对话框1.显示消息对话框("密码错误!", "提示", "确定")

八、常见问题

Q1:数据存储后读不出来?

  • 确认在 已获得值时 事件中读取,不要在调用后立刻读
  • 检查标签名是否完全一致(大小写敏感)
  • 检查网络连接是否正常

Q2:中文存储后乱码?

Q3:数据量太大存不进去?

  • 网络微数据库单个值上限约9000字节
  • 解决方案:拆分存储(如用户列表 + 用户详情分开存)

Q4:多个用户同时操作会冲突吗?

  • 网络微数据库不支持事务,高并发场景可能冲突
  • 大型项目建议使用 CloudDB 或 LeanDB

Q5:如何搭建自己的服务器?


九、数据库方案选择指南

需求推荐方案
简单数据,用户少网络微数据库(TinyWebDB)
需要实时推送云数据库(CloudDB)
国内大型项目LeanDB
完全自主可控MySQL + PHP

参考资料


文档版本:2026.03 | 作者:App Inventor 2 中文网 www.fun123.cn

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:
  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。