SQL

结构化查询语言 (SQL) 是用于应用程序和数据库之间通信的标准语言。 AppFramework Sql QML 插件提供了读取和写入 SQLite、ODBC、PostgreSQL 和 MySQL 数据库以及通过 SQLite 虚拟表读取 DBF 和 CSV 文件的工具。

有关此功能的更多示例,请参阅 ArcGIS AppStudio 中的 SQL 示例。 有关详细信息和示例,请参阅 Esri 社区博客文章 AppStudio 2.0 中的 SQL Beta 简介

要使用此功能,您首先需要包含以下 import 语句:

import ArcGIS.AppFramework.Sql 1.0

SQLite 数据库

SqlDatabase 组件是 Sql QML 插件的核心组件,其提供了用于创建、打开、读取和修改应用程序中 SQL 数据库的大量工具。 以下代码示例会在所设置位置创建一个 SQLite 数据库:

FileFolder {
  id: fileFolder
  path: "~/ArcGIS/Data/Sql"
}

SqlDatabase {
  id: db
  databaseName: fileFolder.filePath("sample.sqlite")
}

Component.onCompleted: {
  fileFolder.makeFolder();
  db.open();
}
注:

所创建的数据库可以由 iOS 以外所有平台中的其他应用程序进行访问。 在 iOS 平台中,此数据库将被沙盒化,且只能由您的应用程序访问。

在创建后,该数据库为空,但您可以使用 query 方法填充数据库并与其进行交互。 以下代码示例替换了上一代码示例中的 component.onCompleted 对象,并使用值表填充所创建的 SQLite 数据库:

Component.onCompleted: {
    fileFolder.makeFolder();
    db.open();
    db.query("CREATE TABLE world_cities (name TEXT,subcountry TEXT, country TEXT)");
    db.query("INSERT INTO world_cities VALUES ('Melbourne', 'Victoria', 'Australia')");
    db.query("INSERT INTO world_cities VALUES ('Redlands', 'California', 'United States')");
}

如果您的查询是 select 语句,则默认情况下第一个相关行会作为 JSON 对象返回。 要返回所有相关行,必须循环遍历表中的所有行。 以下代码示例会将名为 Roads 的表中的所有行作为文本字符串返回:

var query = db.query("SELECT * FROM Roads");
var ok = query.first();
while (ok) {
  console.log(JSON.stringify(query.values));
  ok = query.next();
}
query.finish();

CSV 文件

可以通过在 SQLite 数据库中创建链接表来查询 CSV 文件中的数据。 只有元数据(例如,.csv 文件名)会存储在 SQLite 中,而其中的内容则保留在 CSV 文件中。 CSV 文件可以是应用程序的嵌入式资源,也可以是能通过应用程序访问的外部文件。此处还支持 FileFolder readCsvFile 方法支持的所有选项(dataElementAsArray 除外)。

以下代码示例使用 FileFolder 创建现有 CSV 文件的链接表,以将合适的文件路径存储到 CSV 文件。 databaseName 属性的 :memory: 值指定了内存中的数据库,其中保存有世界城市列表。

SqlDatabase {
    id: db
    databaseName: ":memory:"
}

FileFolder {
    id: dataFolder
    url: "data"
}

Component.onCompleted: {
    var csvFilePath = dataFolder.filePath("world-cities.csv");
    db.open();
    db.query("CREATE VIRTUAL TABLE world_cities USING CSV(filepath=%1,ignoreInvalidLines=%2,valueType=%3)".arg(csvFilePath).arg("false").arg("text");
}

在本主题中
  1. SQLite 数据库
  2. CSV 文件