数据存储

保存和加载数据

QIODevice 类是所有文件和数据存储设备的基类,在 Qt Core 。用于读写数据的所有类均从其继承。

设备范例包括 QFile , QBuffer , QTcpSocket ,和 QProcess . QFile 用于读写文本 二进制文件及资源。 QBuffer 类提供 QIODevice 接口为 QByteArray . QTcpSocket 使开发者能建立 TCP 连接并传输数据流。 QProcess 用于启动外部程序,并对该进程进行读写。

Qt 中的 SQL 支持

Qt SQL 模块使用驱动程序插件与多个数据库 API 通信。Qt 有驱动程序用于 SQLite 、MySQL、DB2、Borland InterBase、Oracle、ODBC 及 PostgreSQL。开发自己的驱动程序也是可能的,若 Qt 未提供所需的驱动程序。

Qt 的 SQL 类可分为 3 层:

目的 范例类
  • 驱动层
  • SQL API 层
  • 用户界面层
  • 在数据库和 SQL API 层之间的底层通信
  • 提供对数据库的访问
  • 把数据从数据库链接到数据感知小部件

采用所有 SQL 驱动程序,除了 SQLite ,可以连接到托管数据库系统的服务器。若使用嵌入式 MySQL 服务器,为使用数据库系统不需要 MySQL 服务器。

有关如何构建 SQL 数据库驱动程序的操作指南,见 SQL 数据库驱动程序 .

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

SQLite 对多用户和多事务有一些限定。若从不同事务读取 (或写入) 文件,应用程序可能冻结,直到某一事务提交 (或回滚)。

一旦驱动程序部分被设置,就可访问数据使用类, QSqlQueryModel , QSqlTableModel ,和 QSqlRelationalTableModel . QSqlTableModel and QSqlRelationalTableModel 提供可以被用于 Qt 项视图的可编辑模型。 QSqlTableModel 能读/写访问单表,而 QSqlRelationalTableModel 能读/写访问主表 (而非带外键的表)。

以下页面包含把 SQL 纳入应用程序的有关信息:

Qt 中的 XML 支持

Qt 提供用于读取和剖析 XML 流及写操作这些流的 API。以下关键类促进这些行动,通过提供必要基础设施:

  • QXmlStreamReader 类提供读取 XML 的剖析器。它是不包括外部剖析实体,格式良好的 XML 1.0 剖析器。
    • 它理解并解析 XML 名称空间。例如,对于 StartElement, namespaceUri() 返回元素所在的名称空间,而 name () 返回元素的本地名称。组合 namespaceUri() 和 name () 标识唯一元素。
    • 它不是 CPU 密集型的,因为它并未把整个 XML 文档树存储在内存中。它仅存储当前报告令牌。
  • QXmlStreamWriter 类提供 XML 写入器采用简单流 API。它搭档 QXmlStreamReader 为写入 XML,且它操作 QIODevice 指定采有 setDevice()。
    • 它是为希望编写的每个 XML 令牌 (或事件) 提供专用函数的简单 API。
    • 它负责基于指定 namespaceUri 为名称空间添加前缀,当写入元素或属性时。若必须使用某些标准化前缀,可以通过采用 writeNamespace() 或 writeDefaultNamespace() 手动声明名称空间以强制作者去使用它们。
    • 它可以通过添加换行和缩进自动格式生成的 XML 数据,以使其可读。可以采用自动格式化特性打开此特征。
    • 默认情况下,它以 UTF-8 编码 XML。可以使用 setCodec() 实施不同编码。

除读写 XML 流外,Qt 还为以下额外用例提供 API:

  • 查询 XML 数据源使用 XQuery 和 XPath
  • XML 变换使用 XSLT
  • XML 模式验证

以下话题对 Qt XML 支持提供更多洞察:

Qt 中的 JSON

JSON 是基于文本的数据交换开放标准,易于读取和剖析。它被用于表示简单的数据结构和称为对象的关联数组。它与 JavaScript 相关,但独立于语言表示法形式。

对象可以采取 2 种形式:

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

本地存储

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

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

API 符合 HTML5 Web 数据库 API 的同步 API,W3C 工作草案 2009 年 10 月 29 日 ( HTML5 Web 数据库 API ).

Qt Quick 范例 - 本地存储 使用本地存储 API 的基本演示。

QSettings 类

QSettings 类为应用程序设置提供持久存储。通常,应用程序会记住其来自先前会话的设置。

设置在不同平台上的存储,是不同的。例如:在 Windows,它们被存储在注册表中,而在 macOS,它们被存储在 XML 文件中。

QSettings 使您能够以可移植方式保存和还原应用程序设置。构造和销毁 QSettings 对象是轻量、快速的。当创建对象 QSettings ,好的实践是不仅要指定应用程序名称,还指定组织名称。例如:

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

资源

Qt Resource System (资源系统) 是独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件。这很顺手,若应用程序频繁需要某个文件 (或某组文件)。它还可以防止特定文件的丢失。

可以把资源数据编译成二进制并立即在应用程序代码中进行访问,或动态创建二进制资源并通过应用程序采用资源系统进行注册。

默认情况下,资源可以通过如在源树中存储的相同文件名从应用程序代码进行访问,采用 :/ 前缀,或通过 URL 采用 qrc 方案。

文件存档

存档文件是一批文件或目录,通常压缩以缩减在驱动器上消耗的空间。存档文件的范例是 ZIP、TAR、RAR 及 7z。

Qt 支持由 zlib 产生的存档 (见 qCompress() 和 qUncompress() ).