Data Storage

Saving and Loading Data

QIODeviceQt Core 中所有文件和数据存储设备的基类. 所有用于读取和写入数据的类都继承自它.

设备的示例有 QFile, QBuffer, QTcpSocket, QProcess. QFile 用于读取文本, 二进制文件和资源. QBufferQByteArray 提供 QIODevice 接口. QTcpSocket 使开发人员能够建立 TCP 连接, 并传输数据流. QProcess 用于启动外部程序, 并读取和写入该进程.

SQL Support in Qt

Qt SQL 模块使用驱动程序插件与多个数据库 API 通信. Qt 的驱动程序支持 SQLite, MySQL, DB2, Borland InterBase, Oracle, ODBC, PostgreSQL. 如果 Qt 没有提供所需的驱动程序, 也可自己开发驱动程序.

Qt 的 SQL 类可以分为 3 层:

LayerPurposeExample class
  • Driver layer
  • SQL API layer
  • User Interface layer
  • 数据库和 SQL API 层之间的低级通信
  • 提供对数据库的访问
  • 将数据从数据库链接到数据显示 widget

使用所有 SQL 驱动程序(SQLite除外), 你可以连接到数据库服务器. 如果你使用嵌入式 MYSQL 服务器, 则不需要 MySQL 服务器, 即可使用数据库系统.

有关如何构建 SQL 数据库驱动程序, 参见SQL Database Drivers.

Qt SQLite 插件非常适合本地存储. SQLite 是一个关系数据库管理系统, 包含在一个小型 (~350 KiB) C 库中. 与其他数据库管理系统相比, SQLite 不是从客户端应用程序访问的单独进程, 而是客户端应用程序的一个组成部分. SQLite 对单个文件进行操作, 打开连接时必须将其设置为数据库名称. 如果该文件不存在, SQLite 将尝试创建它.

SQLite 对于多用户和多事务有一些限制. 如果你正在从不同的事务读取或写入文件, 你的应用程序可能会冻结, 直到一个事务提交或回滚.

一旦设置了驱动程序部分, 就可以使用 QSqlQueryModel, QSqlTableModel, QSqlRelationalTableModel 访问数据. QSqlTableModelQSqlRelationalTableModel 提供可与 Qt 的项目视图一起使用的可编辑模型. QSqlTableModel 对单个表具有读/写访问权限, 而 QSqlRelationalTableModel 对主表 (而不是具有外键的表) 具有读/写访问权限.

以下页面包含有关将 SQL 合并到应用程序中的信息:

XML Support in Qt

Qt 提供了 API 读取和解析 XML 流, 以及写入 XML 流. 以下关键类通过提供必要的基础设施来促进这些行动:

  • QXmlStreamReader 提供了一个解析器来读取XML. 它是一个格式良好的 XML 1.0 解析器, 不包含外部解析实体.
    • 它理解并解析 XML 名称空间. 例如, 对于 StartElement, namespaceUri() 返回元素所在的命名空间, name() 返回元素的本地名称. namespaceUri() 和 name() 的组合唯一标识一个元素.
    • 它不是 CPU 密集型的, 因为它不会将整个 XML 文档树存储在内存中. 它仅存储报告时的当前令牌.
  • QXmlStreamWriter 为 XML 编写器提供了简单的流式 API. 它与用于写入 XML 的 QXmlStreamReader 相对应, 并且在使用 setDevice() 指定 QIODevice.
    • 它是一个简单的 API, 为你想要编写的每个 XML 令牌或事件提供专用函数.
    • 编写元素或属性时, 它根据 namespaceUri 为命名空间添加前缀. 如果必须使用某些标准化前缀, 则可以通过使用 writeNamespace() 或 writeDefaultNamespace() 手动声明命名空间强制编写器使用它们.
    • 它可以通过添加换行符和缩进来自动格式化生成的 XML 数据, 使其可读. 可以通过自动格式化属性打开此功能.
    • 默认情况下, 它以 UTF-8 对 XML 编码. 可以使用 setCodec() 强制执行不同的编码.

Besides reading and writing to XML streams, Qt also provides APIs for the following additional use cases:

  • Querying an XML data source using XQuery and XPath
  • XML transformation using XSLT
  • XML schema validation

The following topics provide more insight into Qt XML support:

JSON in Qt

JSON 是一种基于文本的开放式数据交换标准, 易于阅读和解析. 它用于表示简单的数据结构和关联数组 (称为对象). 它与 JavaScript 相关, 但却是一种独立于语言的表示法形式.

一个对象可以有两种形式:

  • 名称/值对的集合
  • 值的有序列表
  • { "last_name": "Routledge", "first_name": "Ronald", "birth_date": 1960 }
  • "colours": ["green", "blue", "yellow"]

Local Storage

本地存储 API 提供从 QML 和 JavaScript 访问 SQL 数据库中的本地离线存储的能力.

这些数据库是特定于用户和特定于 QML 的, 但可供所有 QML 应用程序访问. 它们使用 SQLite 数据库(SQL 数据库驱动程序) 存储在 QDeclarativeEngine::offlineStoragePath() 的子目录 Databases.

本地存储 API 符合 HTML5 Web 数据库的同步 API, 遵循 2009 年 10 月 29日 W3C 工作草案 (HTML5 Web Database API).

有关使用本地存储 API 的基本演示, 参见 Qt Quick Examples - Local Storage.

QSettings Class

QSettings 提供应用程序设置的持久存储. 应用程序通常会记住上一个会话的设置.

设置在不同平台上的存储方式不同. 例如, 在 Windows 上它们存储在注册表中, 而在 macOS 上它们存储在 XML 文件中.

QSettings 使你能够以便携式方式保存和恢复应用程序设置. 构造和销毁 QSettings 对象是轻量级且快速的. 创建 QSettings 对象时, 最好不仅指定应用程序的名称, 还指定你的组织的名称. 例如:


  QSettings settings("MyCompany", "Accountancy");

Resources

Qt 资源系统是一种独立于平台的机制, 在应用程序的可执行文件中存储二进制文件. 如果你的应用程序经常需要某个文件或一组文件, 这会很方便. 它还可以防止该特定文件丢失 .

资源数据可以编译为二进制文件并立即在应用程序代码中访问, 也可以动态创建二进制资源并由应用程序向资源系统注册.

默认情况下,应用程序代码可以使用与存储在源树中的文件名相同的文件名访问资源, 带有 :/ 前缀, 或通过带有 qrc 方案的 URL 来访问资源.

File Archiving

存档文件是文件或目录的集合, 通常会对其进行压缩, 以减少它们在驱动器上占用的空间. 存档文件的示例有 ZIP, TAR, RAR 和 7z.

Qt 支持 zlib 生成的存档 (参见 qCompress() 和 qUncompress()).