数据存储组件
目录:
云数据库
云数据库
是一个不可见组件,允许您将数据存储在连接到互联网的数据库服务器上(使用Redis),这样你的App上所有用户就能共享数据。 默认情况下,数据将存储在 MIT 维护的服务器中,但是您可以设置和运行自己的服务器。 设置服务地址
属性和服务端口
属性以访问您自己的服务器。
属性
- 项目编号
- 获取此云数据库项目的编号。
- 服务端口
- 要使用的Redis服务器端口,默认为6381。
- 服务地址
- 用于存储数据的Redis服务器地址,“DEFAULT”表示默认使用MIT服务器。
- 令牌
- 此字段包含用于登录到支持的Redis服务器的身份验证令牌。 如果上面服务地址设置“DEFAULT”的话,这个值请不要编辑,系统会自动填上。 一个系统管理员还可以为您提供一个特殊值,可用于在彼此之间共享数据来自多人的多个项目。如果使用您自己的Redis服务器,请在服务器的配置并在此处输入。
- 使用SSL
- 设置为
真
则使用SSL加密通道与云数据库/Redis服务器通信。如果上面服务地址设置“DEFAULT”的话,这个应该设置为真
。
事件
- 云数据库错误(消息)
- 表示与云数据库Redis服务器通信时发生错误。
- 数据发生变化(标签,值)
- 表示云数据库项目中的数据发生了变化,事件触发时
标签
已被更新成最新的值
。 - 第一项已删除(值)
- 由
从列表中删除第一项
方法触发的事件。参数值
是列表中第一个对象,现在已被删除。 - 已获得值(标签,值)
- 指示
获取值
请求已成功。 - 收到标签列表(值)
- 当收到已知标签列表时触发事件,是对
获取标签列表
方法调用的响应。 - 更新完成(标签,operation)
- 表示将数据存储到云数据库的操作已完成。
方法
- 追加值到列表(标签,待添加项)
- 以原子(Atomic)方式将值附加到列表末尾。如果两个设备同时使用此功能,两个设备都会被追加并且不会丢失数据。
- 清除标签(标签)
- 从云数据库中删除标签。
- 云服务已连接()
- 如果在网络上并且能够连接到云数据库服务器,则返回
真
。 - 获取标签列表()
- 要求云数据库检索属于该项目的所有标签。 结果列表在事件
收到标签列表
中返回。 - 获取值(标签,无标签时返回值)
- 要求云数据库获取存储在给定标签下的值。
它将结果传递给
已获得值
中给出。 - 从列表中删除第一项(标签)
- 获取列表的第一个元素并自动删除它。 如果两个设备同时使用此功能,一个将获取第一个元素,另一个将获取第二个元素,如果没有可用元素,则会出现错误。 当元素可用时,将触发
第一项已删除
事件。 - 保存值(标签,待存储值)
- 要求云数据库将给定的
待存储值
存储在给定的标签
下。
数据文件
不可见组件,用于读取 CSV 和 JSON 数据格式的文件,提供各个维度的列表数据,便于解析出我们想要的数据,也可以作为其他组件的数据源。
属性
- 列名列表
- 获取当前已加载的源文件的列名列表。
- 对于 CSV 文件,将返回第一行的数据列表。
- 对于 JSON 文件,将返回 JSON 对象中的键列表。
- 列数据
- 获取当前已加载的源文件的列数据列表。
- 默认作用域
- 指定使用
数据文件
组件访问文件的默认作用域。App作用域适用于大多数应用程序。兼容模式可用于旧的应用程序(新约束之前)Android 上的文件访问。 - 行数据
- 获取当前已加载的源文件的行数据列表。
- 源文件
- 设置数据解析的源文件,然后异步解析文件。结果存储在
列数据
、行数据
及列名列表
属性中。文件格式为 CSV 或 JSON 格式。
事件
无
方法
- 读取文件(文件名)
- 开始加载数据源文件,文件内容的格式是 CSV 或 JSON。
- 在
文件名
前加上/
来读取SD 卡上的特定文件(例如,/myFile.txt
将读取该文件/sdcard/myFile.txt
)。 - 读取应用程序打包的资源(也适用于AI伴侣),
文件名
以//
(两个斜杠)开始。 - 如果一个
文件名
不以/
开头,打包的应用程序会从应用程序的私有存储读取,AI伴侣则是/sdcard/AppInventor/data
目录。
- 在
文件管理器
不可见组件,用于写入或读取设备上的文件,外部文件的路径均由作用域
属性指定,不论应用程序是AI伴侣运行还是已编译、以及应用运行的 Android 版本。
由于较新版本的 Android 要求将文件存储在App特定目录中,因此 默认作用域
设置为 App
,如果使用的是旧版 Android 并且需要访问兼容的公共存储,将 默认作用域
属性更改为兼容
,当然你也可以使用代码块来修改作用域
属性。
下面是每种作用域
类型的简述:
-
App
[推荐]
:Android 2.2及更高版本上文件将从应用程序特定存储中读取和写入,在 Android 早期版本上,文件将写入兼容存储中。-
App的根目录为:
/storage/emulated/0/Android/data
。读写文件在指定的files
目录下,如图:(上面是AI伴侣的App目录,如果最终编译apk运行,则到
appinventor.ai_[账户名].[项目名]
目录下查看文件) -
写入文件的参考代码如下:
-
生成的文件如下:
-
- 程序包 :从应用程序包中读取文件,应用程序包属于只读存储,不可写入。
- 缓存 :文件将从应用程序的缓存目录读取和写入,可以在缓存中重新创建临时文件,也允许用户清理临时文件以重新获得存储空间。
- 兼容 :文件将使用 App Inventor 在nb187版本之前的规则从文件系统读取和写入,也就是说,将从中读取以单个
/
开头的文件名写入外部存储目录的根目录,例如/sdcard/
。 兼容功能将无法在 Android 11 或更高版本上运行。 中文网注:我们与MIT官方最新版本一样,出于安全性考虑,不支持直接从根目录访问文件,如/sdcard/
,推荐使用App模式。 -
私有 :文件将从应用程序的私有目录读取和写入,使用这个作用域存储的数据对其他App不可见。 与App模式类似,读写文件的目录在
files
的data子目录
下: - 共享 :文件将从设备的共享媒体目录中读取和写入,例如
图片
目录。
- 注1:在
兼容
模式下,文件名可以采用以下三种形式之一:- 私有文件:没有前导
/
,写入应用程序私有存储(例如,file.txt
) - 外部文件:有一个前导的
/
,写入公共存储(例如,/file.txt
) - 应用程序包:有两个前导的
//
,只能读取(例如,//file.txt
)
- 私有文件:没有前导
- 注2:在所有作用域内,以两个斜杠 (
//
) 开头的文件名是程序包中的文件,只读,不可写。
属性
- 默认作用域
- 指定使用
文件管理器
组件访问文件的默认作用域,不指定默认私有
。 - 读权限
- 仅用于“界面设计”视图的属性,用于启用
App
作用域之外的文件的读取权限。 - 作用域
- 表示
读取文件
和保存文件
等操作的当前作用域。 - 写权限
- 仅用于“界面设计”视图的属性,用于启用
App
作用域之外的文件的写入权限。
事件
- 文件存储完毕(文件名)
- 当文件内容已被写入完成后,触发该事件。
- 获得文本(文本)
- 当文件内容已被读取完成后,触发该事件。
方法
- 追加内容(文本,文件名)
- 将文本追加写入到文件末尾。如果文件不存在,则创建该文件。查看
保存文件
了解有关文件写入位置的信息。写入成功后,将触发
文件存储完毕
事件。 - 拷贝文件(源作用域,源文件名,目标作用域,目标文件名)
- 将第一个文件的内容复制到第二个文件。
- 删除(文件名)
- 从存储中删除文件。
-
文件名
以/
开头的是用来删除特定的SD卡中的文件(例如,/myFile.txt
将读取该文件/sdcard/myFile.txt
)。 -
文件名
开头没有/
,则删除位于程序的私有存储中文件。 -
以
//
(双斜杠)开头的文件名
是程序包资产文件,是只读的,无法删除会报错。
-
- 是否存在(作用域,路径)
- 测试在指定作用域内给出的路径是否存在。
- 是否是目录(作用域,路径)
- 测试在指定作用域内给出的路径是否是目录。
- 列出目录(作用域,目录名称)
- 获取给定目录中的文件和目录列表。
- 创建目录(作用域,目录名称)
- 创建一个新目录,只要在完成时目录存在,就返回
真
,也就是创建之前目录已经存在的话,也是返回真
。 - 制作完整路径(作用域,路径)
- 将作用域和路径转换为单个字符串形式的完整路径,便于其他组件使用。
关于Android存储路径更深入请参考《Android存储系统基础知识:内部存储,外部存储,App特定目录ASD 及 getASD代码实现》。
- 移动文件(源文件作用域,源文件名,目标文件作用域,目标文件名)
- 将文件从一个位置移动到另一个位置。
- 读取文件(文件名)
- 从存储中的文件中读取文本。
-
文件名
以/
开头的是用来读取 SD 卡上的特定文件(例如,/myFile.txt
将读取该文件/sdcard/myFile.txt
)。 -
以
//
(双斜杠)开头的文件名
是读取应用程序打包的资源(也适用于AI伴侣)。 -
文件名
开头没有/
,它将从应用程序的私有存储中读取文件。
-
- 删除目录(作用域,目录名称,递归)
- 从文件系统中删除目录。如果
递归
为真
,所有内容都将被删除;如果递归
为假
,则只有该目录为空时才能被删除。 - 保存文件(文本,文件名)
- 将文本保存到文件中。
-
文件名
以/
开头则该文件是写入 SD 卡(例如,写入/myFile.txt
会将文件写入/sdcard/myFile.txt
)。 -
文件名
开头没有/
,它将是写入程序的私有数据目录中,其他人无法访问该目录手机上的程序。 -
AI伴侣较为特殊,它作为一个独立的App拥有一个私有目录,但是在测试多个项目时,由于这些App都是运行在AI伴侣的App上,因此会共用AI伴侣的私有目录,当这些程序编译后独立运行,则私有目录就各自独立,互不干扰了。
请注意:如果文件已存在,此块将覆盖该文件。如果你想给文件添加内容请使用
追加内容
方法添加到现有文件。 -
FileTools 拓展
提供一些额外的更加强大的文件相关的操作。是 文件管理器
的加强拓展。
.aix 拓展下载:
FileTools demo程序下载:
属性
无
事件
无
方法
-
返回应用程序特定目录的路径。
-
返回可用存储目录的列表。
-
将文件从源文件夹复制到目标文件夹。
-
将文件从源异步复制到目标。使用此功能复制大文件以避免运行时错误。
-
如果应用程序特定目录不存在,则创建该目录。
ASD(app specific directory)相关知识请参考《Android存储系统基础知识:内部存储,外部存储,App特定目录ASD 及 getASD代码实现》。
-
创建一个目录。它用布尔值 true 或 false 触发“Directory Created”。
-
删除给定的文件或文件夹。如果是目录,则所有子目录将被删除,这可能需要一些时间。它会触发布尔值 true 或 false 的“FileDeleted”事件。
-
如果文件或文件夹存在则返回 true,否则返回 false。
-
从给定目录返回文件列表(如果存在)。使用文件扩展名作为过滤器,如 mp3、txt 等。如果您不想使用过滤器,则使用空字符串。另外,如果不想获取子目录,则设置 ‘ withFolders’ to false else true。如果recursive设置为true,那么它也会递归地从子目录中获取文件。
-
与 FilesList 的工作方式相同,但它异步获取文件列表,这拒绝了从具有如此多文件的目录获取文件列表时出现任何运行时错误的机会。它会引发带有文件列表的“GotFileList”事件。
-
从资产返回文件列表。
-
如果存在则返回路径中的文件名。
-
返回文件或文件夹的当前大小。
-
从文件名返回文件路径。在这种情况下,它将返回 /storage/sdcard/mFile.txt。
-
返回给定目录的文件夹列表。
-
返回目录的可用大小(以字节为单位)。注意:它使用绝对文件路径。
-
将文件路径转换为内容 uri。
-
将文件从源异步移动到目标。
-
检查给定路径是否是完整路径。例如:/testt.txt 和 /mnt/sdcard/Android/com.sunny.notez/files/testt.txt 不相同。
-
返回文件夹/文件是否可执行。
-
如果路径是文件则返回 true,否则返回 false。
-
如果文件/文件夹被隐藏则返回 true,否则返回 false。
-
如果文件/文件夹可读则返回 true,否则返回 false。
-
如果文件/文件夹可写则返回 true,否则返回 false。
-
给定格式的文件/文件夹的最后修改时间。
-
给定文件的 Mime 类型。在上述情况下,它将返回 text/plain。
-
将文件从源移动到目标并删除源文件。
-
将内容 uri 转换为文件路径。
-
重命名文件而不删除它。
-
返回目录的总空间。注意:它使用绝对文件路径。
电子表格(依赖谷歌服务,国内无法使用)
电子表格是一个不可见的组件,用于存储和接收来自使用 Google Sheets API 的 Google Sheets 文档。
要使用此组件,首先必须拥有 Google Developer 帐户,然后,必须在该 Google Developer 下创建一个新项目帐户,在该项目上启用 Google Sheets API,最后创建一个Sheets API 的服务帐户。
有关如何创建服务帐户以及在何处查找的说明使用 Google 表格组件的其他相关信息,可以在此处找到。
行号和列号是从 1 开始索引的。
属性
- ApplicationName
- 您的应用程序名称,用于进行API调用时使用。
- CredentialsJson
- 包含服务账户凭据的JSON文件
- SpreadsheetID
- 您想要编辑的Google Sheets文件的ID。您可以在Google Sheets文件的URL中找到spreadsheetID。
事件
- ErrorOccurred(errorMessage)
- 当API调用遇到错误时触发。错误详情在
errorMessage
中。 - FinishedAddCol(columnNumber)
AddCol
块的回调事件,在表格值更新后调用。同时返回新列的列号。- FinishedAddRow(rowNumber)
AddRow
块的回调事件,在表格值更新后调用。同时返回新行的行号。- FinishedClearRange()
ClearRange
块的回调事件,在表格值更新后调用。- FinishedRemoveCol()
RemoveCol
块的回调事件,在表格值更新后调用。- FinishedRemoveRow()
RemoveRow
块的回调事件,在表格值更新后调用。- FinishedWriteCell()
WriteCell
块的回调事件,在表格值更新后调用。- FinishedWriteCol()
WriteCol
块的回调事件,在表格值更新后调用。- FinishedWriteRange()
WriteRange
块的回调事件,在表格值更新后调用。- FinishedWriteRow()
WriteRow
块的回调事件,在表格值更新后调用。- GotCellData(cellData)
ReadCell
块的回调事件。cellData
是单元格中的文本值。- GotColData(colDataList)
ReadCol
块的回调事件。colDataList
是按行号递增顺序排列的单元格文本值列表。- GotFilterResult(return_rows,return_data)
ReadWithQuery
块的回调事件。response
是满足查询条件的行列表。- GotRangeData(rangeData)
ReadRange
块的回调事件。rangeData
是一个行列表,其维度与rangeReference相同。- GotRowData(rowDataList)
ReadRow
块的回调事件。rowDataList
是按列号递增顺序排列的单元格文本值列表。- GotSheetData(sheetData)
ReadSheet
块的回调事件。sheetData
是一个行列表。
方法
- AddCol(sheetName,data)
- 给定一个值列表作为
data
,将这些值追加到表格的下一个空列中。总是从顶部行开始向下填充。完成后触发FinishedAddCol
回调事件。 - AddRow(sheetName,data)
- 给定一个值列表作为
data
,将这些值追加到表格的下一个空行中。总是从最左侧列开始向右填充。完成后触发FinishedAddRow
回调事件。同时返回新行的行号。 - ClearRange(sheetName,rangeReference)
- 清空给定范围内的单元格。完成后触发
FinishedClearRange
回调事件。 - GetCellReference(row,col)
- 将行和列的整数表示转换为Google Sheets中使用的A1表示法(单个单元格)。例如,行1和列2对应字符串”B1”。
- GetRangeReference(row1,col1,row2,col2)
- 将范围四个角的行和列的整数表示转换为Google Sheets中使用的A1表示法。例如,选择从行1列2到行3列4的范围对应字符串”B1:D3”。
- ReadCell(sheetName,cellReference)
- 在指定的sheetName页面上,读取给定cellReference处的单元格,并触发
GotCellData
回调事件。cellReference可以是A1表示法的文本块,或是getCellReference
块的结果。 - ReadCol(sheetName,colNumber)
- 在指定的sheetName页面上,读取给定colNumber处的列,并触发
GotColData
回调事件。 - ReadRange(sheetName,rangeReference)
- 在指定的sheetName页面上,读取给定rangeReference处的单元格,并触发
GotRangeData
回调事件。rangeReference可以是A1表示法的文本块,或是getRangeReference
块的结果。 - ReadRow(sheetName,rowNumber)
- 在指定的sheetName页面上,读取给定rowNumber处的行,并触发
GotRowData
回调事件。 - ReadSheet(sheetName)
- 读取整个Google Sheets文档并触发
GotSheetData
回调事件。 - ReadWithExactFilter(sheetName,colID,value)
- 筛选Google Sheet中给定列号与提供值完全匹配的行。
- ReadWithPartialFilter(sheetName,colID,value)
- 筛选Google Sheet中给定列号包含提供值字符串的行。
- RemoveCol(sheetName,colNumber)
- 从表格中删除指定列号的列。这不是清空列,而是完全删除它。表格的grid id可以在Google Sheets文档URL的”gid=”后面找到。完成后触发
FinishedRemoveCol
回调事件。 - RemoveRow(sheetName,rowNumber)
- 从表格中删除指定行号(从1开始)的行。这不是清空行,而是完全删除它。表格的grid id可以在Google Sheets文档URL的”gid=”后面找到。完成后触发
FinishedRemoveRow
回调事件。 - WriteCell(sheetName,cellReference,data)
- 给定文本或数字作为
data
,将值写入单元格。会覆盖单元格中的现有数据。完成后触发FinishedWriteCell
回调事件。 - WriteCol(sheetName,colNumber,data)
- 给定一个值列表作为
data
,将这些值写入指定列号的列中,从上到下覆盖现有值。(注意:不会清空整个列。)完成后触发FinishedWriteCol
回调事件。 - WriteRange(sheetName,rangeReference,data)
- 给定一个列表的列表作为
data
,将这些值写入范围内的单元格。范围的行列数必须与数据的维度匹配。此方法会覆盖范围内的现有数据。完成后触发FinishedWriteRange
回调事件。 - WriteRow(sheetName,rowNumber,data)
- 给定一个值列表作为
data
,将这些值写入指定行号的行中,从左到右覆盖现有值。(注意:不会清空整个行。)完成后触发FinishedWriteRow
回调事件。
微数据库
微数据库
是一个不可见的组件,用于存储应用程序的数据。
使用 App Inventor 创建的应用程序在每次运行时都会进行初始化,这意味着如果一个应用程序设置变量的值,然后用户退出应用程序,该变量的值将在下次运行应用程序时不会被记住。 相比之下,微数据库是一个持久化的数据存储,每次运行应用程序时,存储在“微数据库”中的数据都能被记住并获取。例如游戏中保存最高分,并在每次玩游戏时获取它。
-
数据项由标签和值组成,要存储数据项需要指定标签(标签必须是文本块,为数据命名),然后可以根据标签获取存储在该标签下的数据。
-
不能使用“微数据库”在手机上的两个不同App之间传递数据,可以在多屏应用的不同屏幕之间共享数据。
-
在使用AI伴侣开发应用时,使用该AI伴侣的所有应用都将共用一个微数据库,而一旦应用打包之后,数据的共享将不复存在。因此在开发过程中,每次创建新项目时,都需留心清空微数据库。
总结下来,就是“微数据库”只能在同一个App间共享数据,AI伴侣算一个App(所有被测试的程序均归到AI伴侣App上),程序打包编译apk后算作各自的App。
微数据库生命周期:经验证,卸载App后,本地微数据库也会被清理,App重新安装后数据从零开始;而不卸载App覆盖更新时,则不会清理微数据库中的数据!
属性
- 命名空间
- 用于存储数据的命名空间。
事件
无
方法
- 清除所有数据()
- 清除整个数据存储。
- 清除标签数据(标签)
- 清除指定
标签
下的数据。 - 获取数据()
- 以字典形式获取所有数据。
- 获取标签列表()
- 返回数据存储中所有标签的列表(是一个列表对象)。
- 获取值(标签,无标签时返回值)
- 获取指定
标签
下的数据,如果没有该标签,则返回无标签时返回值
中指定的值。 - 保存值(标签,存储值)
- 将
存储值
保存到指定标签
下,当应用程序重新启动时,存储仍然存在于手机上。 -
存储值
可以是文本,也可以是数字,还可以是列表。重复保存同一个标签的话,第二次会覆盖第一次的值,即以最新存储的值为准。
知识拓展
-
微数据库的
存储值
可以是列表吗?我们写了一个测试程序如下:测试结果是:2。说明值取出后成功还原了列表,也说明列表是能够直接存储进微数据库的。
网络微数据库
网络微数据库
组件通过与Web服务通信以存储及查询数据,虽然这个组件是有用的,但是非常有限,主要是作为对那些想要创建自己的组件与 Web 对话的Demo应用
。
随附的 Web 服务位于 http://tinywebdb.appinventor.mit.edu。该组件有方法保存值 和获取值 ,“保存”和“获取”的含义取决于Web服务。在目前的实现中,所有标签和值是字符串(文本),后续版本可能会放开这一限制。
中文网注:
MIT官方的功能很单一,且仅支持英文内容,不支持中文文本存储,中文文本获取出来是乱码。
目前国内也有免费的网络微数据库,支持中文存储和读取,功能上也进行了一定的拓展,详细可以去各自的网站上查看中文文档。2个网站体验差不多,网站如下:
https://tinywebdb.cn/ 经测试,单个键值的容量大小约为 64KB 字节,超过则会保存失败。
https://tinywebdb.appinventor.space/ 经测试,单个键值的容量大小约为 9000 字节(9KB),超过则会保存失败。
更多请参考《App Inventor 2 网络微数据库你用对了吗?》。
属性
- 服务地址
- 指定Web服务的 URL,默认值是 http://tinywebdb.appinventor.mit.edu。
事件
- 已获得值时(网络微数据库标签,网络微数据库值)
获取值
请求服务器执行成功时触发该事件。- 值存储完毕时()
保存值
请求服务器执行成功时触发该事件。- 发生Web服务故障时(消息)
- 与Web服务器的通信发出错误信号时触发该事件。