mucchinのAndroid戦記

Androidアプリで使用するSQLiteのテーブル作成時の注意点

AndroidでSQLiteを使用するので、テーブルを作りたいけど、テーブル作成時のルールや注意点ってあるの?

Androidでは、SQLiteというリレーショナルデータベースが使えます。
データを保存するには、まずはテーブルを作成しなければなりません。


テーブル作成時の決まり事、注意点としては、SQLiteの仕様としては特にないです。
しかし、Androidで用意されているSQLite関係のクラスを利用する際には、ある事を前提として実装されている場合があり、それらのクラスを利用する為には、その前提となっているルールに従っておかなければなりません。
以下が、そのルールです。

ID列を定義する

「列」とは、「カラム」「フィールド」ともいいます。
「ID」とは、それぞれのレコードに対して、一意の番号となる数字の事です。
一つのテーブルの中で重複したIDは無い、といえばわかりやすいでしょうか。

また、このID列の列名は、以下のようにします。
_id

AndroidのSQLite関係のクラスでは、このIDを示す「_id」カラムがあるという前提で実装されているクラスがあります。
例えば、CursorAdapter等です。

その為、AndroidアプリでのSQLite使用時、テーブルを作成するSQL(クエリともいいます。)は、以下のような形にしておきます。

create table テーブル名
  ( _id integer primary key autoincrement,・・・)

_id列は、1、2、3、・・・と格納されるので、型はinteger型です。
また、このIDは、一意の番号で、重複は禁止ですので、primary keyを付けます。

「autoincrement」とは、文字通り、自動的にインクリメントされる、という事を示しています。
レコードのInsert時には、_id列の値を指定無しでInsertを行っても、その時点でのテーブルのレコードを見て、自動的に採番してくれます。


スポンサーリンク




具体例として、ブックマークを保存するためのテーブルを用意するとしますと、以下のような感じです。
create table bookmarklist
 ( _id integer primary key autoincrement , url text not null )
not nullは、NULL値は入れる事はできませんよ!という指定です。
NULLを入れようとすると、エラーになります。

また、レコード挿入時は、以下のようになります。


insert into bookmarklist ( url )
  values (‘https://android.roof-balcony.com’)
ちなみに、
insert文では、挿入する列名(テーブル名の直後、valuesの前の部分)を省略する事ができます。
但し、後から見たときに可読性が落ちるので、省略せずに指定しましょう。
上記のサンプルだと、「url」というカラムに、このURLが格納されると一発でわかりますが、省略されているとテーブルの定義を調べないとわからないので。

また、後々になって、テーブルに列を追加したり削除したりするとき等でも、挿入する列名が省略されていると、意図したところとは違うカラムにデータが入ってしまう事になったりします。

これは、Androidに限らず、SQLの一般的な暗黙的ルールみたいなモノです。