SQLiteを使う(データ挿入と削除)

◆PROCESSING 逆引きリファレンス

 カテゴリー:ファイル操作

SQLiteを使う(データ挿入と削除)

【概要】

PROCESSINGはJavaをベースにした言語ですので、Javaと同じ手順でSQLiteを利用することが可能です。

SQLiteの利用準備とDBのOPEN/CLOSE処理については「SQLiteを使う(オープン・クローズ)」記事で紹介しました。

今回はOPEN(生成)したDBファイルに以下のような表が作成済みである事を前提に、この表へデータを挿入・削除する処理を紹介したいと思います。

なお表の作成については「SQLiteを使う(テーブル生成と削除)」記事を参照してください。

サンプルで利用するTEST表

列名 説明
_id INTEGER 主キー
_datetime TEXT 日付格納用テキスト
_image BLOB バイナリデータ格納用。デフォルト値はNULL
_aspect REAL アスペクト比格納用。デフォルト値は1.0で0より大きいこと

 

【詳細】

データを挿入する

表にデータを挿入(追加)するには、SQLのINSERT文を利用します。

SQLiteでSQL文を利用するためには、Statementクラスのメソッドを利用します。Statementクラスには、単発のSQL文を実行するexecuteUpdate()メソッドがありますので、これを利用します。

例えば以下のような感じです。

state は Statementクラスのインスタンスです。

Statementクラスを生成する方法とexecuteUpdate()メソッドについては、「SQLiteを使う(テーブル生成と削除)」記事を参照してください。

INSERT 文は、基本的には以下のような形式で記述します。

今回データを追加するTESTテーブルは、_IDが主キー(データを一意に識別するための情報)です。

本来はデータを追加するときに、主キーにはユニークな値を指定すべきですが、SQLiteでは主キーにINTEGER型を指定した場合、自動的にユニークな値を振ってくれます。

ですので上記サンプルでは、あえて_IDに値を指定していません。もちろん自分でユニークな値を指定する事も可能です。

 

データを削除する

表からデータを削除するには、SQLのDELETE文を利用します。SQLの実行方法はINSERT文のときと同じです。

state は Statementクラスのインスタンスです。

DELETE文は、基本的には以下のような形式で記述します

 

動的にパラメータを与える

先程の例ではデータの挿入・削除ともに、SQL文の中に直接値を指定していました。例えばINSERT文では、以下のような文字列が出来上がります。

この日付や 0x7F のような部分を、SQL文に直接記述するのではなくプログラムから与えたい場合があります。

そのような場合は、StatementクラスではなくPreparedStatementクラスを利用してSQL文を指定します。

PreparedStatementクラスは、DBへ接続した際に戻されるConnectionクラス経由で利用します。

PreparedStatement作成PreparedStatement psm = con.prepareStatement( String sql );

sql : ベースとなるSQL文
con : Connectionクラスのインスタンス

ベースとなるSQL文には、値を埋め込みたい位置に “?” を記述します。例えば以下のような感じです。

上記ではINSERT文で値を入れたい箇所に “?” で埋め込み指定をしています。

その後、埋め込み指定をした場所に PreparedStatement クラスがもつsetメソッドで、値を埋め込みます。

setメソッドには、埋め込みたい値のデータ型に応じて様々なものが用意されています。

代表的なものは以下になります。詳しくは上記公式リファレンスを参照してください。

メソッド 用途
1 setBinaryStream(int index, InputStream x); index番目にバイナリデータを埋め込みます。
2 setDouble(int index, double x); index番目に浮動小数点データを埋め込みます。
3 setInt(int index, int x); index番目に整数データを埋め込みます。
4 setString(int index, String x) index番目に文字列データを埋め込みます。
5 setByte(int index, byte x) index番目に1バイトデータを埋め込みます。
6 setNull(int index, java.sql.Types.NULL) index番目にNULLを埋め込みます。

 

注意点

INSERTやDELETEでデータ操作を行う際、注意すべき事が2つほどあります。

  • カラムの型に適合したデータを挿入すること
  • 基本はオートコミットされる
1.データ型とカラム型

1つ目の注意点は、データを挿入するときはテーブルの各カラムの型に適合した値を指定する事です。

SQLiteではカラムの型と挿入するデータの型に相違があっても、エラーにはなりません。指定されたデータがカラム型に変換可能であれば変換して格納し、不可能ならそのまま格納します。

その結果、1つのカラムに異なるデータ型が混在するような事になる場合もあります。ここはハマるポイントですので注意してください。

参考:Qiita様:【SQLite3】コマンド例と他データベースとの比較から始める SQLite 入門:@d-yokoiさん

 

2.オートコミット

もう1つの注意点は、デフォルトでオートコミットを採用している点です。

複数の表を整合性をもって更新したい場合は、オートコミットをOFFにして、自力でコミット(あるいはロールバック)を行います。

オートコミット制御void con.setAutoCommit( boolean flg );

con : Connectionクラスのインスタンス
flg : true オートコミットを有効化/ false オートコミット無効化

con はDBへ接続した際に戻されるConnectionクラスのインスタンスです。

オートコミットを無効化した場合の注意としては、自分でコミットしない限り、プログラム終了時にすべてのDB操作が「無かったこと」にされる事です。

CREATE TABLEやDROP TABLEも「無かったこと」にされますので、注意してください。

コミットとロールバックは、以下のように利用します。

コミット・ロールバックvoid con.commit( );
void con.rollback( );

con : Connectionクラスのインスタンス

以下はオートコミットを無効化し、自力でコミットする例です。

コミットとロールバックは、ともに例外を発生させることがあるため、例外処理を加えてください。

 

【関連記事】

 


サンプルプログラム

画像データを保存する例:

dataフォルダ配下に girl.png という画像データがある前提です。

画像データを読み込んで、DBにINSERTします。INSERT後に、検証のためにSELECTしていますが、検索処理については別記事で紹介させてもらいます。

サンプルなので、何度も実行すると同じ画像データが何度もINSERTされてしまいますが、そこは必要に応じて改変してください。

<出力サンプル>

(画像URL:illust-AC 様:えふ3776さん)

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。