山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

明けましてSQLite

明けましておめでとうございます。

本年もどうぞよろしくお願いいたします。


さてここ最近スマホでDBを使おうと

思いSQLiteをいじっています。

そこでわかったことをメモしておきます。


SQLiteについて。

基本的にはアプリケーションに組み込みで

使う用途。

型の扱いが独特。create tableで型を指定

しなくてもよい。型がないわけではなく

自動的に判定されてデータが登録される。

create tableで型を指定してもよいが

指定していない型のデータも入る。

データ型はNULL,INTEGER,REAL,TEXT,BLOB。

もちろん桁数はありません。

今時桁数を定義するほうがナンセンスですね。


OracleからSQLiteにデータを投入する。

OracleにCLOBで改行や記号満載のデータが

あるのでCSVはいろいろ大変そう。

OracleサーバーにODBCを入れてSQLite

リンクテーブルを張る方法もできそうだが

設定が難しそう。

JDBCでプログラムを書いてselect/insertする

のが一番簡単そうという結論に。


SQLiteJDBCドライバはこちらのサイト。

sqlite-jdbc



JDBCドライバの使い方はSQLiteに限らず

ちょっと特殊でわかりにくい。

Class.forName("org.sqlite.JDBC");

のようにJDBCドライバを読み込む必要が

あります。このコードは指定したクラスを

生成して返すのですが、返ってきた

インスタンスを変数に格納していないので

そのまま捨てていることになります。

実際にはクラスのスタティックイニシャライザで

DriverManagerに登録するようになっている

ようです。


わかりにくいと思っていたらJDBC4.0では

Class.forName()をする必要がなくなった

ようです。わかりやすくなって歓迎なの

ですが、SQLiteJDBCドライバはそれに

対応していないようで、Class.forName()を

しないといけませんでした。


今回同時にOracleSQLiteJDBCドライバを

使っているのですが、使い分けは

どうしたらよいのか少し迷いました。

結論としては自動的に使い分けられました。

おそらくDriverManager.getConnection()の

接続文字列から自動的に判別していると

思われます。


SQLiteの型は柔軟とはいえ、商品コードなど

全部数字でも文字列として入れておきたい

ので、PreparedStatementでちゃんと型を

指定してsetStringなどしましたが、SQLite

のドライバのソースを見るとsetObjectで

大丈夫そうでした。

setObjectの中で引数の型をinstanceofで

判別していました。

ただしさすがにOracleのCLOBには対応して

いないのでそこだけは文字列に変えて

setStringします。


WindowsコマンドプロンプトUTF-8に対応

していません。SQLite内の日本語を表示させ

ようとselect文で出力すると文字化けします。

今時びっくりですが、表示させる方法はない

ようです。できると書いてある記事もありますが

私のPCではできませんでした。