Androidで利用出来るBASICでSQLiteを操作する。（後編　レコードの追加、更新、削除）（ BASIC プログラミング ）

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

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

また、SQLiteについては別の記事も書いています。今回はその後編になります。

* [Androidで利用出来るBASICでSQLiteを操作する。（前編　テーブル作成と確認）](http://qiita.com/basictomonokai/items/88ee3619e24f4b4da2cd)

本稿ではレコード削除〜レコード更新〜レコード追加について記載します。

##1. 今回利用するデータベース、テーブル

今回利用するデータベースは前編で作成したメモ用のデータを使います。項目と内容は以下の通り。全て文字列型の項目です。メモの分類と件名でユニークになるようにプログラムで制御しています。

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

DB名は「treememo.db」、テーブル名は「tree001」です。

##2.レコードの削除

BASIC!のプログラムでデータベースのレコードを指定した分類と件名で削除します。プログラムのポイントは以下の通りです。

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

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

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

> DBポインター、テーブル名、抽出列名（カンマ区切り）、Where句がパラメータ。データのカーソル番号がセットされます。Where句には削除するメモの分類と件名がAND条件で指定されています。

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

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

* SQL.DELETE命令でレコードを削除。

> SQL.NEXT命令で取得したレコードが１件の場合だけレコードを削除します。DBポインター、テーブル名、Where句がパラメータ。

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

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


```
REM Start of BASIC! Program
rem TBL row del
!------- DB sakujo routine ----- 

dbname$="treememo.db"

SQL.OPEN DB_Ptr, dbname$

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

dbunrui$="その他"
dkenmei$="このソフトについて２"

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

Where$ = "bunrui = '" + dbunrui$ + "' AND kenmei = '" + dkenmei$ + "'"

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

PRINT WHERE$;"の検索結果"

xdone = 0

dcount=0

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

print dcount

if dcount=1 then
  SQL.DELETE DB_ptr, tbname$, Where$
  print "削除完了"
else
  if dcount=0 then
     print "削除レコードが存在しません"
  else
     print "削除レコードが複数あります"
  endif 
endif

SQL.CLOSE DB_Ptr

end
```

##3.レコードの更新

BASIC!のプログラムでデータベースのレコードを指定した分類と件名で特定して更新します。プログラムのポイントは以下の通りです。

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

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

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

> DBポインター、テーブル名、抽出列名（カンマ区切り）、Where句がパラメータ。データのカーソル番号がセットされます。Where句には更新するメモの分類と件名がAND条件で指定されています。

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

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

* SQL.UPDATE命令でレコードを更新。

> SQL.NEXT命令で取得したレコードが１件の場合だけレコードを更新します。DBポインター、テーブル名と（項目名、データ内容）のペア（項目数分）、Where句がパラメータ。

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

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


```
REM Start of BASIC! Program
rem TBL row upd
!------- DB henkou routine ----- 

dbname$="treememo.db"

SQL.OPEN DB_Ptr, dbname$

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

ubunrui$="その他"
ukenmei$="このソフトについて２"
upicurl$="http://www.kimiwata.com/img/free_illust/illust/cafe_natsumi.png"
unaiyou$="更新したテストデータ"

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

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

Where$ = "bunrui = '" + ubunrui$ + "' AND kenmei = '" + ukenmei$ + "'"

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

PRINT WHERE$;"の検索結果"

xdone = 0

dcount=0

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

print dcount

if dcount=1 then
  SQL.UPDATE DB_Ptr, tbname$, c1$,ubunrui$,c2$,ukenmei$,c3$,upicurl$,c4$,unaiyou$,c5$,today$: Where$
  print "更新完了"
else
  if dcount=0 then
     print "更新対象レコードが存在しません"
  else
     print "更新対象レコードが複数あります"
  endif 
endif

SQL.CLOSE DB_Ptr

end
```

##4.レコードの追加

BASIC!のプログラムでデータベースのレコードを追加します。プログラムのポイントは以下の通りです。

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

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

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

> DBポインター、テーブル名、抽出列名（カンマ区切り）、Where句がパラメータ。データのカーソル番号がセットされます。Where句には追加するメモの分類と件名がAND条件で指定されています。

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

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

* SQL.INSERT命令でレコードを追加。

> SQL.NEXT命令で取得したレコードが0件の場合だけレコードを追加します。DBポインター、テーブル名と（項目名、データ内容）のペア（項目数分）がパラメータ。

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

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


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

dbname$="treememo.db"

SQL.OPEN DB_Ptr, dbname$

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

ibunrui$="その他"
ikenmei$="このソフトについて２"
ipicurl$="http://www.kimiwata.com/img/free_illust/illust/cafe_natsumi.png"
inaiyou$="更新したテストデータ"

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

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

Where$ = "bunrui = '" + ibunrui$ + "' AND kenmei = '" + ikenmei$ + "'"

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

PRINT WHERE$;"の検索結果"

xdone = 0

dcount=0

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

print dcount

if dcount=0 then
  SQL.INSERT DB_Ptr, tbname$, c1$,ibunrui$,  c2$,ikenmei$, c3$,ipicurl1$, c4$,inaiyou$, c5$,today$
  print "追加完了"
else
   print "追加レコードと同一種類＋件名のレコードがあります"
endif

SQL.CLOSE DB_Ptr

end
```


##5.まとめ

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

* AndroidではSQLiteというデータベースが標準で利用可能。
* BASIC!ではSQLiteを簡単に利用できる。
* BASIC!のSQLite命令でレコードの削除、更新、追加はとても簡単。

最後にBASIC!で上記命令を利用して作成したプログラムの動画が以下です。

* 【BASIC!】ツリー型メモ帳を妥協の産物で作ってみた( BASIC プログラミング ) 
[![youtube動画表示エリア](http://img.youtube.com/vi/8E0-yjurKrg/0.jpg)](http://www.youtube.com/watch?v=8E0-yjurKrg) 

BASICでもこのくらいは出来るので気楽に試せると思います。