Xojo + SQLite で遊ぶ 

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

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

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

# Xojoの罠

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/846c69a7-3048-ac8c-88c5-d28a052d15bf.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/34df0729-34b2-4c7f-6d8a-b22eba287c01.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
```

１つだけデータ入れてみる

```

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5e6dbb1d-3c02-e04a-95d0-bf3397f4155b.png)

# アプリ作成

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fcf9d27b-eef8-3f27-8493-142d99f28919.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を２つ、OKボタンを１つドラッグドロップします。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に置き、カラム数を４にします。

ラベルをつけたりOKを書き直したりして体裁を整えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/21d2d994-631f-00b8-7c81-e8391091c7ec.png)

実行したところ。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d9a49aa3-6869-0ea6-8a2e-a6ba7ec4ad05.png)


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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e79a6700-51f6-f823-b722-858d648ef182.png)



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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1bb93c1b-3825-6fe3-89f3-c722887c341b.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を使ったりしましたがコマンドの出力が取れなかったりということで、このツールを使うのは断念しました。