◆PROCESSING 逆引きリファレンス
カテゴリー:ファイル操作
SQLiteを使う(テーブル生成と削除)
【概要】
PROCESSINGはJavaをベースにした言語ですので、Javaと同じ手順でSQLiteを利用することが可能です。
SQLiteの利用準備とDBのOPEN/CLOSE処理については「SQLiteを使う(オープン・クローズ)」記事で紹介しました。
今回はOPEN(生成)したDBファイルに、データを格納するテーブルを作成する処理を紹介したいと思います。
【詳細】
DB操作用インスタンス取得
テーブルの生成には、SQL文を利用します。
SQLiteでSQL文を利用するためには、Statementクラスのメソッドを利用します。
Statementクラスのインスタンスは、DriverManagerクラスのgetConnectionメソッドから戻されたConnectionクラスが持つcreateStatemenメソッドを利用して生成します。
DB操作用インスタンス取得Statement stm = con.createStatement();
con : getConnection()で得たDBへの接続オブジェクト
stm : DB操作用インスタンス
Statementクラスは、テーブルを生成するSQL文を発行する以外にも利用します。
1 2 3 4 5 6 7 8 9 10 11 |
try{ //DBをOPENする Connection conn = DriverManager.getConnection( "jdbc:sqlite:" + dbName ); //操作用インスタンスを取得する Statement stm = conn.createStatement(); } catch( SQLException e ){ e.printStackTrace(); } |
上記はDBをOPENして、操作用インスタンスを取得する例です。
操作用インスタンスの取得に失敗すると例外が発生するので、必ず例外処理を記述してください。
テーブル生成
生成したStatementインスタンスには、SQL文を発行するexecuteUpdate()メソッドがあります。
テーブルを生成するためには、このexecuteUpdate()メソッドにCREATE TABLEを行うSQL文を渡します。
DB操作用インスタンス取得int ret = stm.executeUpdate( String sql );
sql : 実行するSQL文
ret : CREATE TABLEやDROP TABLEの場合は0
executeUpdate()メソッドは、テーブルの生成やINSERT/UPDATEのような複数の戻り値(検索結果など)を必要としないSQL文の実行に利用します。
似たような命令にexecute()メソッドがあります。ネット上では、executeUpdate()ではなくexecute()メソッドを利用しているサンプルも多く見かけます。
テーブルの生成やINSERT/UPDATEのようなSQL文を発行するなら、どちらを利用しても大差ないでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
try{ //DBをOPENする Connection conn = DriverManager.getConnection( "jdbc:sqlite:" + dbName ); //操作用インスタンスを取得する Statement stm = conn.createStatement(); //テーブルを生成する String sql = "CREATE TABLE IF NOT EXISTS TEST( " + "_id INTEGER PRIMARY KEY," + "_datetime TEXT," + "_image BLOB DEFAULT NULL ," + "_aspect REAL DEFAULT 1.0 CHECK( _aspect > 0 ) )"; stm.executeUpdate( sql ); } catch( SQLException e ){ e.printStackTrace(); } |
上記はテーブルを生成する例です。SQLの実行に失敗すると例外が発生するので、必ず例外処理を記述してください。
CREATE TABLE 文は、基本的には以下のような形式で記述します。
1 2 3 4 5 |
CREATE TABLE IF NOT EXISTS テーブル名 ( フィールド名 データ型 制約条件, フィールド名 データ型 制約条件, ‥‥ ) |
“IF NOT EXISTS” 部分は指定しなくてもOKです。ただし指定しない場合、すでに存在するテーブルと同名のテーブルを作成しようとすると、例外エラーとなるので注意してください。
フィールド名は、みなさんが自由につける項目名です。ただし、SQLiteではテーブル名やフィールド名は大文字・小文字を区別しません。CREATE文で同じテーブル内に複数の同名フィールドを指定すると、例外エラーとなります。
データ型には、以下の何れかが指定可能です。
データ型 | 説明 |
---|---|
NULL | NULLがはいります。 |
INTEGER | 符号付きの整数を格納する項目 |
TEXT | 可変文字列を格納する項目 |
REAL | 浮動小数点を格納する項目 |
NUMERIC | 数値(精度10桁(小数部5桁)の固定小数点、真偽値など)を格納する項目 |
BLOB | バイナリデータを格納する項目 |
SQLiteでは、日付を直接格納するような型はありません。Javaで扱うなら、日付を文字列として格納するのが、よくあるパターンのようです。
SQLiteでの日付の扱いについては、下記サイト様などが参考となります。
制約条件には、以下のような項目が指定可能です。
制約条件 | 説明 |
---|---|
PRIMARY KEY | 主キーである事を宣言します |
UNIQUE | データが一意である事を指定します |
NOT NULL | NULLではない事を指定します |
DEFAULT 値 | 値を初期値にします |
AUTOINCREMENT | INSERT時に自動的に通番を振ります |
CHECK( 条件式 ) | INSERT時に条件式に適合したものだけ挿入します |
SQLIteのCREATE文については、下記サイト様などが参考となります。私も参考にさせて頂きました。ありがとうございます。
- コピペで実践PHP 様(2022/05 Linkが見つかりません)
- Qiita 様:SQLite3まとめ:@ChiakiYamaokaさん
- DBOnline 様
テーブルの削除
executeUpdate()メソッド(またはexecute()メソッド)にDROP TABLE文を与える事で、テーブルを削除することが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
try{ //DBをOPENする Connection conn = DriverManager.getConnection( "jdbc:sqlite:" + dbName ); //操作用インスタンスを取得する Statement stm = conn.createStatement(); //テーブルを削除する String sql = "DROP TABLE IF EXISTS TEST"; stm.executeUpdate( sql ); } catch( SQLException e ){ e.printStackTrace(); } |
上記はテーブルを削除する例です。SQLの実行に失敗すると例外が発生するので、必ず例外処理を記述してください。
DROP TABLE文は、基本的には以下のような形式で記述します。
1 |
DROP TABLE IF EXISTS テーブル名, テーブル名, ‥‥ |
“IF EXISTS” 部分は指定しなくてもOKです。ただし指定しない場合、存在しないテーブルを削除しようとすると、例外エラーとなるので注意してください。
【関連記事】
サンプルプログラム
テーブルを生成する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
import java.sql.*; /** * PROCESSING3.0 SQLIte CREATE TABLE Sample * @auther MSLABO * @version 2019/07 1.0 */ Connection conn = null; Statement stm = null; void setup(){ size(300,300); //DBファイルはスケッチフォルダに生成する String dbName = sketchPath("test.db"); //DBをOPENする try{ //DBをOPENする conn = DriverManager.getConnection( "jdbc:sqlite:" + dbName ); //操作用インスタンスを取得する stm = conn.createStatement(); stm.close(); //テーブルがあれば削除する String sql = "DROP TABLE IF EXISTS TEST"; stm.executeUpdate( sql ); //テーブルを生成する sql = "CREATE TABLE IF NOT EXISTS TEST( " + "_id INTEGER PRIMARY KEY," + "_datetime TEXT," + "_image BLOB DEFAULT NULL ," + "_aspect REAL DEFAULT 1.0 CHECK( _aspect > 0 ) )"; stm.executeUpdate( sql ); stm.close(); println("TEST TABLE を生成しました"); } catch( SQLException e ){ e.printStackTrace(); } finally { //DBをクローズする dbClose(); } } void draw(){ } /** * DB CLOSE処理 */ void dbClose(){ try { if( stm != null && !stm.isClosed() ){ //操作用インスタンスをクローズする stm.close(); } if( conn != null && !conn.isClosed() ) { //DBをクローズする conn.close(); } } catch ( SQLException e ) { e.printStackTrace(); } } |
TESTテーブルが存在すれば削除し、その後で新規に作成しています。
TESTテーブルは、以下のような形式になっています。
列名 | 型 | 説明 |
---|---|---|
_id | INTEGER | 主キー |
_datetime | TEXT | 日付格納用テキスト |
_image | BLOB | バイナリデータ格納用。デフォルト値はNULL |
_aspect | REAL | アスペクト比格納用。デフォルト値は1.0で0より大きいこと |
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。