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");
}