SQL

SQL (Structured Query Language) は、アプリとデータベース間の通信に使用される標準言語です。 AppFramework の Sql QML プラグインは、SQLite、ODBC、PostgreSQL、MySQL データベースを読み書きするツールと、SQLite 仮想テーブルを介して DBF および CSV を読み取るツールを提供します。

この機能のその他の例としては、ArcGIS AppStudio の SQL サンプルをご覧ください。 詳細および例については、Esri コミュニティ ブログ記事「AppStudio 2.0 の SQL ベータ機能の概要」をご参照ください。

この機能を使用するには、まず次のインポート ステートメントを含める必要があります。

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 ファイル

CSV ファイルのデータは、SQLite データベースにリンク テーブルを作成することで検索できます。 SQLite に格納されるのはメタデータ (.csv のファイル名など) のみで、コンテンツは 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 ファイル