Androidで利用出来るBASICでSQLiteを操作する。（前編　テーブル作成と確認）（ BASIC プログラミング ）

BASIC!は、Androidで動くBASIC インタープリタです。詳しくは以下をどうぞ。

* [AndroidでBASICを使う](http://qiita.com/basictomonokai/items/25bcb21ec69c00e9ad23)

BASIC!ではAndroidに標準で搭載されているデータベースSQLiteを一部機能限定ですが利用可能です。

久々に使ってみようと思い、記憶をたどるのに苦労したので使う人はいないと思いますがまとめます。

本稿ではDB（テーブル）作成〜データ投入〜データ内容の確認について記載します。

##1.SQLIteとは

Androidで何もインストールしないで使えるリレーショナルデータベースです。その程度の知識しかありません。詳しくはウィキペディアをご覧ください。

* [SQLite（ウィキペディア）](https://ja.m.wikipedia.org/wiki/SQLite)


可搬性に優れているので他のタブレットにコピーしたい場合でも.dbファイルをコピーするだけで利用可能です。

##2.BASIC!でのSQLiteの利用の前提

本来のSQLiteは画像データなども保存可能なようですがBASIC!で扱えるデータは文字列型のみです。

また、利用するSQLiteのデータベースの配置先はBASIC!をインストールすると作成されるrfo-basicディレクトリ配下のdatabasesディレクトリになります。

##3. 今回作成するデータベース、テーブル

今回作成するデータベースはメモ用のデータを格納します。項目と内容は以下の通り。全て文字列型の項目です。

* _id ： SQLiteで自動で作成されるレコード通番
* bunrui ： メモの分類
* kenmei ： メモの件名
* picurl ： メモと関連する画像URL
* naiyou ： メモの内容
* updymd ： 更新日時(YYYYMMDDHHMMSS)

DB名は「treememo.db」、テーブル名は「tree001」で作成し、テストしてます。


##4.データベース、テーブルの作成

BASIC!のプログラムでデータベースとテーブルを作成します。プログラムのポイントは以下の通りです。

* SQL.OPEN命令でデータベースを作成。

> DB名がパラメータ。DBが存在しなければ作成、存在すればオープンしてそのポインターがセットされます。

* SQL.NEW_TABLE命令でテーブルを生成。

> DBポインターとテーブル名と項目名がパラメータ。項目は全て文字列項目になります。

* SQL.CLOSE命令でデータベースを閉じる。

> DBポインターがパラメータ。

```
REM Start of BASIC! Program
rem DB generate
!------- TBL Initialize (NEW) routine ----- 
syoki:

dbname$="treememo.db"

SQL.OPEN DB_Ptr, dbname$

tbname$ = "tree001"
c1$ = "bunrui"
c2$ = "kenmei"
c3$ = "picurl"
c4$ = "naiyou"
c5$ = "updymd"

SQL.NEW_TABLE DB_Ptr, tbname$, c1$, c2$, c3$, c4$,c5$

SQL.CLOSE DB_Ptr

end
```

##5.テーブルへのデータの投入

BASIC!のプログラムでテーブルにデータを作成します。プログラムのポイントは以下の通りです。

* SQL.OPEN命令でデータベースを開く。

> DB名がパラメータ。DBが存在しているので、オープンしてそのポインターがセットされます。

* SQL.INSERT命令でデータをテーブルに挿入。

> DBポインターとテーブル名と（項目名、データ内容）のペア（項目数分）がパラメータ。項目は全て文字列項目になります。投入するデータの行数分、複数回実行します。

* SQL.CLOSE命令でデータベースを閉じる。

> DBポインターがパラメータ。


```
REM Start of BASIC! Program
rem TBL insert
!------- TBL Insert routine ----- 
syoki:

dbname$="treememo.db"

SQL.OPEN DB_Ptr, dbname$

tbname$ = "tree001"
c1$ = "bunrui"
c2$ = "kenmei"
c3$ = "picurl"
c4$ = "naiyou"
c5$ = "updymd"

time y$, m$, d$, h$, n$, s$
today$=y$+m$+d$+h$+n$+s$

bunrui1$="その他"
kenmei1$="このソフトについて"
picurl1$="http://zunko.jp/sozai/zunkot_s/zzm_a1zunko01.png"
naiyou1$="テスト用のデータです。中身はありません。\n２行目です。\n３行目です。"
updymd1$=today$


SQL.INSERT DB_Ptr, tbname$, c1$,bunrui1$,  c2$,kenmei1$, c3$,picurl1$, c4$,naiyou1$, c5$,updymd1$

bunrui1$="その他"
kenmei1$="このソフトについて２"
picurl1$="http://zunko.jp/sozai/zunkot_s/zzm_a1zunko28.png"
naiyou1$="テスト用のデータです２。中身はありません。\n２行目です。\n３行目です。"
updymd1$=today$


SQL.INSERT DB_Ptr, tbname$, c1$,bunrui1$,  c2$,kenmei1$, c3$,picurl1$, c4$,naiyou1$, c5$,updymd1$


bunrui1$="その他"
kenmei1$="このソフトについて３"
picurl1$="http://zunko.jp/sozai/zunkot_s/zzm_a1zunko07.png"
naiyou1$="テスト用のデータです３。中身はありません。\n２行目です。\n３行目です。"
updymd1$=today$


SQL.INSERT DB_Ptr, tbname$, c1$,bunrui1$,  c2$,kenmei1$, c3$,picurl1$, c4$,naiyou1$, c5$,updymd1$


bunrui1$="その他２"
kenmei1$="このソフトについて４"
picurl1$="http://zunko.jp/sozai/zunkot_s/zzm_a1zunko12.png"
naiyou1$="テスト用のデータです４。中身はありません。\n２行目です。\n３行目です。"
updymd1$=today$


SQL.INSERT DB_Ptr, tbname$, c1$,bunrui1$,  c2$,kenmei1$, c3$,picurl1$, c4$,naiyou1$, c5$,updymd1$


SQL.CLOSE DB_Ptr

end
```

##6.テーブルへのデータ内容の確認

BASIC!のプログラムでテーブルからデータを全レコード読みだしてコンソール画面に表示します。プログラムのポイントは以下の通りです。

* SQL.OPEN命令でデータベースを開く。

> DB名がパラメータ。DBが存在しているので、オープンしてそのポインターがセットされます。

* SQL.QUERY命令でデータ検索しカーソル番号を取得。

> DBポインターとテーブル名と抽出列名（カンマ区切り）がパラメータ。データのカーソル番号がセットされます。カーソルは抽出した複数レコードが格納されるメモリー上の領域と私は理解しています。詳しくは以下のウィキペディアの記事をご確認ください。

>* [カーソル_(データベース)（ウィキペディア）](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB_(%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9))

>> 補足：SQL.QUERY命令では省略可のパラメータとしてWhere句指定とorder指定ができます。

>>>
```
Sql.query <cursor_nvar>, <DB_pointer_nvar>, <table_name_sexp>, <columns_sexp> {,
<where_sexp> {, <order_sexp>} }
```

>> Where句用変数とorder用変数ともにカンマでつないで複数の項目が指定可能ですがorderのみ指定したい場合にWhere句用変数を空にして指定することが必須になっています。

* カーソルに保持されているレコード数分だけSQL.NEXT命令でデータ取得。

> カーソル番号がパラメータ。SQL.QUERY命令で指定した抽出列名の個個の項目が各文字型変数にセットされます。カーソルの最終レコードになる（＝特殊変数xdoneがtrue）までコンソール画面に表示しながら実行します。

* SQL.CLOSE命令でデータベースを閉じる。

> DBポインターがパラメータ。



```
REM Start of BASIC! Program
rem TBL print all

dbname$="treememo.db"

SQL.OPEN DB_Ptr, dbname$

tbname$ = "tree001"
c1$ = "bunrui"
c2$ = "kenmei"
c3$ = "picurl"
c4$ = "naiyou"
c5$ = "updymd"

title$ = "全件データ一覧"

Columns$ = "_id," + c1$  +"," + c2$ + "," +c3$ + "," + c4$ + "," + c5$

SQL.QUERY Cursor, DB_Ptr, tbname$,  Columns$

PRINT title$

xdone = 0
DO
 SQL.NEXT xdone,cursor,index$,v1$,v2$,v3$,v4$,v5$
 if !xdone THEN 
    print "---- sta ----"
    PRINT  index$
    print  v1$
    print  v2$
    print  v3$
    PRINT  v4$
    print  v5$
    print "---- end ----"
 endif   
UNTIL xdone
PRINT " "


SQL.CLOSE DB_Ptr

end
```

> 処理結果のBASIC!コンソール画面は以下の通りです。

![Screenshot_2016-01-27-12-20-59.png](https://qiita-image-store.s3.amazonaws.com/0/35574/0ec94475-c930-fdc8-329d-8abd5ffc092a.png)


##7.まとめ

まとめると以下の通りです。

* AndroidではSQLiteというデータベースが標準で利用可能。
* BASIC!ではSQLiteを簡単に利用できる。
* BASIC!でSQLite利用する場合、項目は全て文字列項目である必要がある。
* BASIC!のSQLite命令はとても簡単。

レコードの更新、削除については本稿では記載していませんが同様の方法で利用できます。BASICでもこのくらいは出来るので気楽に試せると思います。