Help us understand the problem. What is going on with this article?

Xojo + SQLite で遊ぶ

RDBMS アプリのレクチャーをする時に使うバックエンドは MySQL とかですよね。
けれども参加者の手元のPCで体験するとなると手軽に使える SQLite が便利。
ストレージとしてファイルを1つ置くだけでサービスを動かさなくてもいいし、Python とかには標準でドライバが入っているので ODBC がどうのとか考えなくても良い。

Xojo も、SQLiteがデフォルトで扱える。ほかにも、PostgreSQL、MySQL、Oracle、Microsoft SQL Server に接続する機能が標準で入っていて優秀。

今回、XojoでSQLiteを操作してみる。

Xojoの罠

最初に罠が待ち受けているとは! Xojoには RDBMS 使うユーティリティーがついている。

image.png

この図を見ると、まずtableを作って名前を変更。あとはこのツールでフィールドとタイプを作るといいね。

image.png

これは楽ちん・・・と思うけれどもこれは罠。

このツールを使いたい衝動をぐっとこらえ、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のプログラムを保存する場所と同じ場所に移動する。

image.png

アプリ作成

Xojo には SQLite 使うサンプルアプリがあるが、それとは別にイチから作ってみる。

SQLiteTest と名前を付けてDesktopアプリを作成する。

image.png

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を書き直したりして体裁を整えます。

image.png

実行したところ。

image.png

おまけ Xojoのデータベース操作ツールの不具合

画面上部のボタンを押してテーブルを1つ、カラムを5つ作成する。

image.png

Behaviorでテーブル名、フィールド名、フィールドタイプを調整

終わったら画面上部のチェックマークを押して保存。

image.png

保存後、フィールドタイプが 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はストレージクラスという概念で型を使うらしいです。

https://www.sqlite.org/datatype3.html

ストレージクラスには以下があり、float や Timestamp は無いそうです。

  • NULL
  • INTEGER
  • REAL
  • TEXT
  • BLOB

型の指定が間違ったのが原因?と思いましたがコレ以外にも謎のエラーがあったり、Enter Custom SQL Commandを使ったりしましたがコマンドの出力が取れなかったりということで、このツールを使うのは断念しました。

nanbuwks
iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away