数据存储组件

« 返回首页

数据存储组件

目录:

  1. icon 云数据库
  2. icon 数据文件
  3. icon 文件管理器
  4. icon 电子表格
  5. icon 微数据库
  6. icon 网络微数据库

icon 云数据库

云数据库是一个不可见组件,允许您将数据存储在连接到互联网的数据库服务器上(使用Redis),这样你的App上所有用户就能共享数据。 默认情况下,数据将存储在 MIT 维护的服务器中,但是您可以设置和运行自己的服务器。 设置服务地址属性和服务端口属性以访问您自己的服务器。

属性

项目编号
获取此云数据库项目的编号。
服务端口
要使用的Redis服务器端口,默认为6381。
服务地址
用于存储数据的Redis服务器地址,“DEFAULT”表示默认使用MIT服务器。
令牌
此字段包含用于登录到支持的Redis服务器的身份验证令牌。 如果上面服务地址设置“DEFAULT”的话,这个值请不要编辑,系统会自动填上。 一个系统管理员还可以为您提供一个特殊值,可用于在彼此之间共享数据来自多人的多个项目。如果使用您自己的Redis服务器,请在服务器的配置并在此处输入。
使用SSL
设置为则使用SSL加密通道与云数据库/Redis服务器通信。如果上面服务地址设置“DEFAULT”的话,这个应该设置为

事件

云数据库错误(消息)
表示与云数据库Redis服务器通信时发生错误。
数据发生变化(标签,)
表示云数据库项目中的数据发生了变化,事件触发时标签已被更新成最新的
第一项已删除()
从列表中删除第一项 方法触发的事件。参数 是列表中第一个对象,现在已被删除。
已获得值(标签,)
指示 获取值 请求已成功。
收到标签列表()
当收到已知标签列表时触发事件,是对 获取标签列表 方法调用的响应。
更新完成(标签,operation)
表示将数据存储到云数据库的操作已完成。

方法

追加值到列表(标签,待添加项)
以原子(Atomic)方式将值附加到列表末尾。如果两个设备同时使用此功能,两个设备都会被追加并且不会丢失数据。
清除标签(标签)
从云数据库中删除标签。
云服务已连接()
如果在网络上并且能够连接到云数据库服务器,则返回
获取标签列表()
要求云数据库检索属于该项目的所有标签。 结果列表在事件 收到标签列表 中返回。
获取值(标签,无标签时返回值)
要求云数据库获取存储在给定标签下的值。

它将结果传递给 已获得值 中给出。

从列表中删除第一项(标签)
获取列表的第一个元素并自动删除它。 如果两个设备同时使用此功能,一个将获取第一个元素,另一个将获取第二个元素,如果没有可用元素,则会出现错误。 当元素可用时,将触发 第一项已删除 事件。
保存值(标签,待存储值)
要求云数据库将给定的 待存储值 存储在给定的 标签 下。

icon 数据文件

不可见组件,用于读取 CSV 和 JSON 数据格式的文件,提供各个维度的列表数据,便于解析出我们想要的数据,也可以作为其他组件的数据源。

属性

列名列表
获取当前已加载的源文件的列名列表。
  • 对于 CSV 文件,将返回第一行的数据列表。
  • 对于 JSON 文件,将返回 JSON 对象中的键列表。
列数据
获取当前已加载的源文件的列数据列表。
默认作用域
指定使用数据文件组件访问文件的默认作用域。App作用域适用于大多数应用程序。兼容模式可用于旧的应用程序(新约束之前)Android 上的文件访问。
行数据
获取当前已加载的源文件的行数据列表。
源文件
设置数据解析的源文件,然后异步解析文件。结果存储在 列数据行数据列名列表 属性中。文件格式为 CSV 或 JSON 格式。

事件

方法

读取文件(文件名)
开始加载数据源文件,文件内容的格式是 CSV 或 JSON。
  • 文件名 前加上 / 来读取SD 卡上的特定文件(例如,/myFile.txt 将读取该文件 /sdcard/myFile.txt)。
  • 读取应用程序打包的资源(也适用于AI伴侣),文件名//(两个斜杠)开始。
  • 如果一个文件名 不以 / 开头,打包的应用程序会从应用程序的私有存储读取,AI伴侣则是/sdcard/AppInventor/data目录。

icon 文件管理器

不可见组件,用于写入或读取设备上的文件,外部文件的路径均由作用域 属性指定,不论应用程序是AI伴侣运行还是已编译、以及应用运行的 Android 版本。

由于较新版本的 Android 要求将文件存储在App特定目录中,因此 默认作用域 设置为 App,如果使用的是旧版 Android 并且需要访问兼容的公共存储,将 默认作用域 属性更改为兼容,当然你也可以使用代码块来修改作用域属性。

下面是每种作用域类型的简述:

  • App [推荐] :Android 2.2及更高版本上文件将从应用程序特定存储中读取和写入,在 Android 早期版本上,文件将写入兼容存储中。

    • App的根目录为:/storage/emulated/0/Android/data。读写文件在指定的 files 目录下,如图:

      App根目录

      (上面是AI伴侣的App目录,如果最终编译apk运行,则到 appinventor.ai_[账户名].[项目名] 目录下查看文件)

    • 写入文件的参考代码如下:

      写入文件代码

    • 生成的文件如下:

      写入文件结果

  • 程序包 :从应用程序包中读取文件,应用程序包属于只读存储,不可写入。
  • 缓存 :文件将从应用程序的缓存目录读取和写入,可以在缓存中重新创建临时文件,也允许用户清理临时文件以重新获得存储空间。
  • 兼容 :文件将使用 App Inventor 在nb187版本之前的规则从文件系统读取和写入,也就是说,将从中读取以单个/开头的文件名写入外部存储目录的根目录,例如 /sdcard/。 兼容功能将无法在 Android 11 或更高版本上运行中文网注:我们与MIT官方最新版本一样,出于安全性考虑,不支持直接从根目录访问文件,如/sdcard/,推荐使用App模式。
  • 私有 :文件将从应用程序的私有目录读取和写入,使用这个作用域存储的数据对其他App不可见。 与App模式类似,读写文件的目录在 filesdata子目录 下:

    私有根目录

  • 共享 :文件将从设备的共享媒体目录中读取和写入,例如图片目录。
  1. 注1:在 兼容 模式下,文件名可以采用以下三种形式之一:
    • 私有文件:没有前导 / ,写入应用程序私有存储(例如,file.txt
    • 外部文件:有一个前导的/,写入公共存储(例如,/file.txt
    • 应用程序包:有两个前导的 //只能读取(例如,//file.txt
  2. 注2:在所有作用域内,以两个斜杠 (//) 开头的文件名是程序包中的文件,只读,不可写

属性

默认作用域
指定使用 文件管理器 组件访问文件的默认作用域,不指定默认 私有
读权限
仅用于“界面设计”视图的属性,用于启用App作用域之外的文件的读取权限。
作用域
表示 读取文件保存文件 等操作的当前作用域。
写权限
仅用于“界面设计”视图的属性,用于启用App作用域之外的文件的写入权限。

事件

文件存储完毕(文件名)
当文件内容已被写入完成后,触发该事件。
获得文本(文本)
当文件内容已被读取完成后,触发该事件。

方法

追加内容(文本,文件名)
将文本追加写入到文件末尾。如果文件不存在,则创建该文件。查看 保存文件 了解有关文件写入位置的信息。

写入成功后,将触发 文件存储完毕 事件。

拷贝文件(源作用域,源文件名,目标作用域,目标文件名)
将第一个文件的内容复制到第二个文件。
删除(文件名)
从存储中删除文件。
  1. 文件名/ 开头的是用来删除特定的SD卡中的文件(例如,/myFile.txt 将读取该文件/sdcard/myFile.txt)。

  2. 文件名 开头没有 /,则删除位于程序的私有存储中文件。

  3. //(双斜杠)开头的文件名 是程序包资产文件,是只读的,无法删除会报错。

是否存在(作用域,路径)
测试在指定作用域内给出的路径是否存在。
是否是目录(作用域,路径)
测试在指定作用域内给出的路径是否是目录。
列出目录(作用域,目录名称)
获取给定目录中的文件和目录列表。
创建目录(作用域,目录名称)
创建一个新目录,只要在完成时目录存在,就返回 ,也就是创建之前目录已经存在的话,也是返回
制作完整路径(作用域,路径)
将作用域和路径转换为单个字符串形式的完整路径,便于其他组件使用。

关于Android存储路径更深入请参考《Android存储系统基础知识:内部存储,外部存储,App特定目录ASD 及 getASD代码实现》。

移动文件(源文件作用域,源文件名,目标文件作用域,目标文件名)
将文件从一个位置移动到另一个位置。
读取文件(文件名)
从存储中的文件中读取文本。
  1. 文件名/ 开头的是用来读取 SD 卡上的特定文件(例如,/myFile.txt 将读取该文件/sdcard/myFile.txt)。

  2. //(双斜杠)开头的文件名 是读取应用程序打包的资源(也适用于AI伴侣)。

  3. 文件名 开头没有 /,它将从应用程序的私有存储中读取文件。

删除目录(作用域,目录名称,递归)
从文件系统中删除目录。如果递归,所有内容都将被删除;如果递归,则只有该目录为空时才能被删除。
保存文件(文本,文件名)
将文本保存到文件中。
  1. 文件名/ 开头则该文件是写入 SD 卡(例如,写入 /myFile.txt 会将文件写入/sdcard/myFile.txt)。

  2. 文件名 开头没有 /,它将是写入程序的私有数据目录中,其他人无法访问该目录手机上的程序。

  3. AI伴侣较为特殊,它作为一个独立的App拥有一个私有目录,但是在测试多个项目时,由于这些App都是运行在AI伴侣的App上,因此会共用AI伴侣的私有目录,当这些程序编译后独立运行,则私有目录就各自独立,互不干扰了。

请注意:如果文件已存在,此块将覆盖该文件。如果你想给文件添加内容请使用 追加内容 方法添加到现有文件。

FileTools 拓展

提供一些额外的更加强大的文件相关的操作。是 文件管理器 的加强拓展。

.aix 拓展下载:

com.sunny.FileTools.aix

FileTools demo程序下载:

FileTools.aia

属性

事件

方法

  1. 1

    返回应用程序特定目录的路径。

  2. 2

    返回可用存储目录的列表。

  3. 3

    将文件从源文件夹复制到目标文件夹。

  4. 4

    将文件从源异步复制到目标。使用此功能复制大文件以避免运行时错误。

  5. 5

    如果应用程序特定目录不存在,则创建该目录。

    ASD(app specific directory)相关知识请参考《Android存储系统基础知识:内部存储,外部存储,App特定目录ASD 及 getASD代码实现》。

  6. 6

    创建一个目录。它用布尔值 true 或 false 触发“Directory Created”。

  7. 7

    删除给定的文件或文件夹。如果是目录,则所有子目录将被删除,这可能需要一些时间。它会触发布尔值 true 或 false 的“FileDeleted”事件。

  8. 8

    9

    如果文件或文件夹存在则返回 true,否则返回 false。

  9. 从给定目录返回文件列表(如果存在)。使用文件扩展名作为过滤器,如 mp3、txt 等。如果您不想使用过滤器,则使用空字符串。另外,如果不想获取子目录,则设置 ‘ withFolders’ to false else true。如果recursive设置为true,那么它也会递归地从子目录中获取文件。

  10. 与 FilesList 的工作方式相同,但它异步获取文件列表,这拒绝了从具有如此多文件的目录获取文件列表时出现任何运行时错误的机会。它会引发带有文件列表的“GotFileList”事件。

  11. 从资产返回文件列表。

  12. 如果存在则返回路径中的文件名。

  13. 返回文件或文件夹的当前大小。

  14. 从文件名返回文件路径。在这种情况下,它将返回 /storage/sdcard/mFile.txt。

  15. 返回给定目录的文件夹列表。

  16. 返回目录的可用大小(以字节为单位)。注意:它使用绝对文件路径。

  17. 将文件路径转换为内容 uri。

  18. 将文件从源异步移动到目标。

  19. 检查给定路径是否是完整路径。例如:/testt.txt 和 /mnt/sdcard/Android/com.sunny.notez/files/testt.txt 不相同。

  20. 返回文件夹/文件是否可执行。

  21. 如果路径是文件则返回 true,否则返回 false。

  22. 如果文件/文件夹被隐藏则返回 true,否则返回 false。

  23. 如果文件/文件夹可读则返回 true,否则返回 false。

  24. 如果文件/文件夹可写则返回 true,否则返回 false。

  25. 给定格式的文件/文件夹的最后修改时间。

  26. 给定文件的 Mime 类型。在上述情况下,它将返回 text/plain。

  27. 将文件从源移动到目标并删除源文件。

  28. 将内容 uri 转换为文件路径。

  29. 重命名文件而不删除它。

  30. 返回目录的总空间。注意:它使用绝对文件路径。

icon 电子表格(依赖谷歌服务,国内无法使用

电子表格是一个不可见的组件,用于存储和接收来自使用 Google Sheets API 的 Google Sheets 文档。

要使用此组件,首先必须拥有 Google Developer 帐户,然后,必须在该 Google Developer 下创建一个新项目帐户,在该项目上启用 Google Sheets API,最后创建一个Sheets API 的服务帐户。

有关如何创建服务帐户以及在何处查找的说明使用 Google 表格组件的其他相关信息,可以在此处找到。

行号和列号是从 1 开始索引的。

属性

ApplicationName
The name of your application, used when making API calls.
CredentialsJson
The JSON File with credentials for the Service Account
SpreadsheetID
The ID for the Google Sheets file you want to edit. You can find the spreadsheetID in the URL of the Google Sheets file.

事件

ErrorOccurred(errorMessage)
Triggered whenever an API call encounters an error. Details about the error are in errorMessage.
FinishedAddCol(columnNumber)
The callback event for the AddCol block, called once the values on the table have been updated. Additionally, this returns the column number for the new column.
FinishedAddRow(rowNumber)
The callback event for the AddRow block, called once the values on the table have been updated. Additionally, this returns the row number for the new row.
FinishedClearRange()
The callback event for the ClearRange block, called once the values on the table have been updated.
FinishedRemoveCol()
The callback event for the RemoveCol block, called once the values on the table have been updated.
FinishedRemoveRow()
The callback event for the RemoveRow block, called once the values on the table have been updated.
FinishedWriteCell()
The callback event for the WriteCell block, called once the values on the table have been updated.
FinishedWriteCol()
The callback event for the WriteCol block, called once the values on the table have been updated.
FinishedWriteRange()
The callback event for the WriteRange block, called once the values on the table have been updated.
FinishedWriteRow()
The callback event for the WriteRow block, called once the values on the table have been updated.
GotCellData(cellData)
The callback event for the ReadCell block. The cellData is the text value in the cell.
GotColData(colDataList)
The callback event for the ReadCol block. The colDataList is a list of text cell-values in order of increasing row number.
GotFilterResult(return_rows,return_data)
The callbeck event for the ReadWithQuery block. The response is a list of rows, where each row satisfies the query.
GotRangeData(rangeData)
The callback event for the ReadRange block. The rangeData is a list of rows, where the dimensions are the same as the rangeReference.
GotRowData(rowDataList)
The callback event for the ReadRow block. The rowDataList is a list of text cell-values in order of increasing column number.
GotSheetData(sheetData)
The callback event for the ReadSheet block. The sheetData is a list of rows.

方法

AddCol(sheetName,data)
Given a list of values as data, appends the values to the next empty column of the sheet. It will always start from the top row and continue downwards. Once complete, it triggers the FinishedAddCol callback event.
AddRow(sheetName,data)
Given a list of values as data, appends the values to the next empty row of the sheet. It will always start from the left most column and continue to the right. Once complete, it triggers the FinishedAddRow callback event. Additionally, this returns the row number for the new row.
ClearRange(sheetName,rangeReference)
Empties the cells in the given range. Once complete, this block triggers the FinishedClearRange callback event.
GetCellReference(row,col)
Converts the integer representation of rows and columns to A1-Notation used in Google Sheets for a single cell. For example, row 1 and col 2 corresponds to the string "B1".
GetRangeReference(row1,col1,row2,col2)
Converts the integer representation of rows and columns for the corners of the range to A1-Notation used in Google Sheets. For example, selecting the range from row 1, col 2 to row 3, col 4 corresponds to the string “B1:D3”.
ReadCell(sheetName,cellReference)
On the page with the provided sheetName, reads the cell at the given cellReference and triggers the GotCellData callback event. The cellReference can be either a text block with A1-Notation, or the result of the getCellReference block.
ReadCol(sheetName,colNumber)
On the page with the provided sheetName, reads the column at the given colNumber and triggers the GotColData callback event.
ReadRange(sheetName,rangeReference)
On the page with the provided sheetName, reads the cells at the given rangeReference and triggers the GotRangeData callback event. The rangeReference can be either a text block with A1-Notation, or the result of the getRangeReference block.
ReadRow(sheetName,rowNumber)
On the page with the provided sheetName, reads the row at the given rowNumber and triggers the GotRowData callback event.
ReadSheet(sheetName)
Reads the entire Google Sheets document and triggers the GotSheetData callback event.
ReadWithExactFilter(sheetName,colID,value)
Filters a Google Sheet for rows where the given column number matches the provided value.
ReadWithPartialFilter(sheetName,colID,value)
Filters a Google Sheet for rows where the given column number contains the provided value string.
RemoveCol(sheetName,colNumber)
Deletes the column with the given column number from the table. This does not clear the column, but removes it entirely. The sheet’s grid id can be found at the end of the url of the Google Sheets document, right after the “gid=”. Once complete, it triggers the FinishedRemoveCol callback event.
RemoveRow(sheetName,rowNumber)
Deletes the row with the given row number (1-indexed) from the table. This does not clear the row, but removes it entirely. The sheet’s grid id can be found at the end of the url of the Google Sheets document, right after the “gid=”. Once complete, it triggers the FinishedRemoveRow callback event.
WriteCell(sheetName,cellReference,data)
Given text or a number as data, writes the value to the cell. It will override any existing data in the cell with the one provided. Once complete, it triggers the FinishedWriteCell callback event.
WriteCol(sheetName,colNumber,data)
Given a list of values as data, writes the values to the column with the given column number, overriding existing values from top down. (Note: It will not erase the entire column.) Once complete, it triggers the FinishedWriteCol callback event.
WriteRange(sheetName,rangeReference,data)
Given list of lists as data, writes the values to cells in the range. The number of rows and columns in the range must match the dimensions of your data. This method will override existing data in the range. Once complete, it triggers the FinishedWriteRange callback event.
WriteRow(sheetName,rowNumber,data)
Given a list of values as data, writes the values to the row with the given row number, overriding existing values from left to right. (Note: It will not erase the entire row.) Once complete, it triggers the FinishedWriteRow callback event.

icon 微数据库

微数据库是一个不可见的组件,用于存储应用程序的数据。

使用 App Inventor 创建的应用程序在每次运行时都会进行初始化,这意味着如果一个应用程序设置变量的值,然后用户退出应用程序,该变量的值将在下次运行应用程序时不会被记住。 相比之下,微数据库是一个持久化的数据存储,每次运行应用程序时,存储在“微数据库”中的数据都能被记住并获取。例如游戏中保存最高分,并在每次玩游戏时获取它。

  1. 数据项由标签和值组成,要存储数据项需要指定标签(标签必须是文本块,为数据命名),然后可以根据标签获取存储在该标签下的数据。

  2. 不能使用“微数据库”在手机上的两个不同App之间传递数据,可以在多屏应用的不同屏幕之间共享数据

  3. 在使用AI伴侣开发应用时,使用该AI伴侣的所有应用都将共用一个微数据库,而一旦应用打包之后,数据的共享将不复存在。因此在开发过程中,每次创建新项目时,都需留心清空微数据库。

总结下来,就是“微数据库”只能在同一个App间共享数据,AI伴侣算一个App(所有被测试的程序均归到AI伴侣App上),程序打包编译apk后算作各自的App。

属性

命名空间
用于存储数据的命名空间。

事件

方法

清除所有数据()
清除整个数据存储。
清除标签数据(标签)
清除指定 标签 下的数据。
获取数据()
以字典形式获取所有数据。
获取标签列表()
返回数据存储中所有标签的列表(是一个列表对象)。
获取值(标签,无标签时返回值)
获取指定 标签 下的数据,如果没有该标签,则返回 无标签时返回值 中指定的值。
保存值(标签,存储值)
存储值 保存到指定 标签 下,当应用程序重新启动时,存储仍然存在于手机上。

存储值可以是文本,也可以是数字,还可以是列表

重复保存同一个标签的话,第二次会覆盖第一次的值,即以最新存储的值为准。

知识拓展

  • 微数据库的存储值可以是列表吗?我们写了一个测试程序如下:

    微数据库存储列表测试

    测试结果是:2。说明值取出后成功还原了列表,也说明列表是能够直接存储进微数据库的。

icon 网络微数据库

网络微数据库 组件通过与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服务器的通信发出错误信号时触发该事件。

方法

获取值(标签)
获取值 请求Web服务获取存储在指定 标签 下的值,如果 标签 下没有存储值,则返回什么取决于Web服务。

该组件接受返回任何内容,然后 获取值 事件将在完成时触发。

保存值(标签,待存储值)
向Web服务发送请求,将给定的 待存储值 存储在指定的 标签 下,值存储完成 事件将在完成时触发。