RDBMS アプリのレクチャーをする時に使うバックエンドは MySQL とかですよね。
けれども参加者の手元のPCで体験するとなると手軽に使える SQLite が便利。
ストレージとしてファイルを1つ置くだけでサービスを動かさなくてもいいし、Python とかには標準でドライバが入っているので ODBC がどうのとか考えなくても良い。
Xojo も、SQLiteがデフォルトで扱える。ほかにも、PostgreSQL、MySQL、Oracle、Microsoft SQL Server に接続する機能が標準で入っていて優秀。
今回、XojoでSQLiteを操作してみる。
Xojoの罠
最初に罠が待ち受けているとは! Xojoには RDBMS 使うユーティリティーがついている。
この図を見ると、まずtableを作って名前を変更。あとはこのツールでフィールドとタイプを作るといいね。
これは楽ちん・・・と思うけれどもこれは罠。
このツールを使いたい衝動をぐっとこらえ、SQLite の専用ツールを別に動かそう。
(ツールの不具合の詳細は末尾に記載。)
SQLiteをCUIで操作
SQLiteのクライアントツールを環境に合わせインストール。
起動するとこのような画面になる。
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
まずは、データベースファイルを作成
.open sensordata.sqlite
テーブルを作成
create table if not exists sensor (
id INTEGER PRIMARY KEY AUTOINCREMENT,
sensor integer,
temp real,
hemi real
);
テーブル生成を確認
.tables
1つだけデータ入れてみる
INSERT INTO sensor ( sensor,temp,hemi ) VALUES (1,22.0,85.0);
データ入ったかどうか確認
select * from sensor;
1|1|22.0|85.0
いくつかデータ入れてみる
select * from sensor;
1|1|22.0|85.0
2|1|14.0|85.0
3|1|16.0|60.0
4|1|32.0|77.0
終了
.quit
ファイルをXojoのプログラムを保存する場所と同じ場所に移動する。
アプリ作成
Xojo には SQLite 使うサンプルアプリがあるが、それとは別にイチから作ってみる。
SQLiteTest と名前を付けてDesktopアプリを作成する。
Appを選び、Insert-Property で Name を db, TypeをSQLitedatabase とします。
もう一度Appを選び、Insert-Event Handler-Open で以下を書く
self.db = New SQLiteDatabase
self.db.DatabaseFile = New FolderItem("..\sensordata.sqlite")
Try
self.db.Connect
Catch error As DatabaseException
MessageBox("DB open error: " + error.Message)
Return
End Try
window1に移ってTextFieldを2つ、OKボタンを1つドラッグドロップします。OKボタンをダブルクリックしてActionに以下を書きます。
var Record as new DatabaseRow
dim temp as string
temp = tempField.value
dim hemi as string
hemi = hemiField.value
try
app.db.ExecuteSQL("INSERT INTO sensor ( sensor,temp,hemi ) VALUES (1,"+temp+","+hemi+");")
Catch error as DatabaseException
MessageBox error.Message
end try
次に、OKボタンをもう一つ置き、ダブルクリックしてActionに以下のコードを書きます。
var temp,hemi as double
var rs as RowSet
Listbox1.RemoveAllRows
Listbox1.ColumnAlignmentAt(0)=ListBox.Alignments.Center
//Listbox1.ColumnAlignmentAt(1)=ListBox.Alignments.Centor
//Listbox1.ColumnAlignmentAt(2)=ListBox.Alignments.Centor
//Listbox1.ColumnAlignmentAt(3)=ListBox.Alignments.Centor
try
rs =app.db.SelectSQL("SELECT id,sensor,temp,hemi FROM sensor")
Catch e as DatabaseException
messagebox e.Message
end try
try
for each row as databaserow in rs
temp = val(row.column("temp").stringvalue)
hemi = val(row.column("hemi").stringvalue)
Listbox1.AddRow( row.column("id").StringValue,row.column("sensor"),format(temp,"##.#"),format(hemi,"##.#") )
next
Catch e as DatabaseException
messagebox e.Message
end try
最後に、ListBoxをWIndowに置き、カラム数を4にします。
ラベルをつけたりOKを書き直したりして体裁を整えます。
実行したところ。
おまけ Xojoのデータベース操作ツールの不具合
画面上部のボタンを押してテーブルを1つ、カラムを5つ作成する。
Behaviorでテーブル名、フィールド名、フィールドタイプを調整
終わったら画面上部のチェックマークを押して保存。
保存後、フィールドタイプが Unknownとなるものがある。謎。
→ サポートに問い合わせたらバグだそうです。
The first thing about this is that there are some bugs in the Xojo UI for database editing so I would not trust what it says. Do you happen to have another SQLite editor that lets you view the database?
型をSQLite用に指定したらうまくいくのかな?
SQLiteはストレージクラスという概念で型を使うらしいです。
ストレージクラスには以下があり、float や Timestamp は無いそうです。
- NULL
- INTEGER
- REAL
- TEXT
- BLOB
型の指定が間違ったのが原因?と思いましたがコレ以外にも謎のエラーがあったり、Enter Custom SQL Commandを使ったりしましたがコマンドの出力が取れなかったりということで、このツールを使うのは断念しました。