Tips

Android SQLiteデータベースとSQL 【Android TIPS】

1
データベース その1
SQLiteデータベースとSQL
この章では、Androidに搭載されているSQLiteデータベースと、SQLの基礎について解説します。
SQLiteデータベース
AndroidではSQLite(エスキューライト)を完全にサポートしています。

SQLiteはMySQLやOracleのようなデータベース管理システムで、クライアントサーバー型ではなくライブラリの形で利用できる軽量のデータベースであり、データは全て1つのファイルに保存されます。
一般的なRDBMS(リレーショナルデータベース管理システム)に比べて大量のデータの扱いには向きませんが、全プログラムを合わせても600kb前後なので、アプリケーションローカルで使用するデータベースエンジンとしては非常に合理的に作られているといえるでしょう。
また標準で搭載しているデータ型が整数型(INTEGER)、浮動小数型(REAL)、文字列型(TEXT)、無制限スカラ型(BLOB)の4種類しかないことも特徴的です。

作成したデータベースはアプリケーションのどのクラスからでもアクセスできますが、他のアプリケーションからはアクセスできません。
データベースファイルは次ののディレクトリに保存されます。
/data/data/パッケージ名/databases/

プリファレンスと同様に、root化された端末では、他のアプリケーションのデータベースへアクセス可能となります。また、アプリケーションを削除するとすべてのデータが破棄されます。

下図のようにデータベースの中には、複数のテーブルが存在することが可能です。
テーブルに関しては後ほど解説します。

SQLiteデータベースのデータ型
Javaにデータ型が存在しているように、データベースにもデータ型が存在します。

SQLiteでは5種類のデータ型が使用可能で、SQLite標準搭載の4種類のデータ型とnull(厳密にはデータ型ではない)です。SQLiteで扱えるデータ型の一覧は下表の5つです。

データ型 主な機能 記述方法による判断基準の例
INTEGER
(符号付整数型)
1,2,3,4,5,6,8 byteのいずれかで格納 少数点もしくは指数ではない
REAL
(浮動小数型)
8 byteで格納 小数点もしくは指数である
TEXT
(文字列型)
UTF-8, UTF-16BE, UTF-16-LE
のいずれかで格納
シングルクォート(’)で
囲まれている
BLOB
(無制限スカラ型)
入力データをそのまま格納
NULL NULL値を格納
 
SQL文
SQL (Structured Query Language)はAndroidのSQLiteデータベースに限らず、RDBMSにおいてデータの操作や定義を行うためのデータベース言語です。

SQLは下表に記載のあるデータ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つから構成されています。

概要
データ定義言語 データベースの定義を行うためのSQL
表の定義などを行う
データ操作言語 データの操作を行うためのSQL
データの登録や検索、更新、削除を行う
データ制御言語 データの操作を行うためのSQL
トランザクション処理の開始、完了、取消を行う
 

SQLの特徴は以下の2つです。

  • 意味の途切れない範囲で任意に改行および空白を挿入することが可能です。
  • 大文字小文字を区別しません。(※本書では読みやすさを考慮し、SQL構文(予約語)は大文字、カラム名は小文字で記述します。)
 

使用頻度が高いSQL文と主な機能は下表の通りです。

SQL文 主な機能
データ定義言語(DDL) CREATE オブジェクトを作成するSQLコマンド
DROP オブジェクトを削除するSQLコマンド
ALTER オブジェクトの構造を変更するコマンド
データ操作言語(DML) INSERT テーブルにデータを登録するSQLコマンド
SELECT テーブルからデータを取り出すSQLコマンド
UPDATE テーブル内のデータを更新するSQLコマンド
DELETE テーブルからデータを削除するSQLコマンド
トランザクション処理
データの更新処理によっては、複数のデータの更新処理を連続して実行(1つの関連性のある集まりとして管理)する必要がある場合があります。そのような場合に、複数のデータ更新処理を1つの単位にまとめて管理することが可能で、その処理単位がトランザクションです。

例えば、AさんがBさんに銀行ATMで¥1,000振り込むとします。
もしAさんの振込処理が完了し、Bさんの口座に入金処理が反映する前に、システム障害が発生したらどうなるでしょう?Aさんの口座の残高は¥1,000減りますが、Bさんの口座の残高は¥1,000増えていないということになります。これでは困りますね。

そこでトランザクションの登場です。
振込処理を1つのトランザクションとして扱い、『Aさんの口座残高を¥1,000減らし、Bさんの口座残高を¥1,000増やす』という一連の処理が完了するまでは、データベース内に保存されているデータを更新しない、とすれば問題は解決できます。
このような一連の処理の流れをトランザクション処理と呼びます。

テーブルについて
テーブルはExcel表のような2次元の表形式となっています。
下表はテーブルとテーブル内に存在するデータのイメージです。

id name1 name2 event age
1 山田 一郎 ゴルフ 10
2 鈴木 NULL 野球 20
3 佐藤 三郎 フィギュアスケート 30
4 田中 四郎 ゴルフ 40
5 村田 五郎 サッカー 50
 

次の3点を確認してみてください。

  • 1行目(id,name1,name2,event,age)がカラム名(項目名)であり、テーブル作成時に決定する項目です。
  • 2行目以降の1列目(1,2,3,4,・・・)はidの値であり主キーとなっています。SQLiteではPRIMARY KEY制約を設定すると、そのカラム(主キー)が自動付番となります。
  • name1 ,name2,event,ageの各データが値です。
主キー(PRIMARY KEY)とPRIMARY KEY制約について
主キー(PRIMARY KEY)とは、テーブルの各行を一意に識別するための列を指します。あるカラムにPRIMARY KEY制約を設定することで、その列が主キーになります。

PRIMARY KEY制約を設定したカラムのデータ型がINTEGERの場合、自動的に連続する数値が割り振られます。次のように記述します。

CREATE TABLE テーブル名(カラム名 INTEGER PRIMARY KEY, …);
 
SQLによるテーブル操作
それではSQLの各構文について解説していきます。

  • CREATE文
  • オブジェクトを作成するSQLコマンドです。
    テーブル作成時の基本構文は以下の通りです。

    CREATE TABLE テーブル名(カラム名1 データ型1, カラム名2 データ型2, …);
    

    先に示したテーブルを作成する場合、SQL文は以下のように記述します。
    カラム名(項目)を複数記述する場合はカンマで区切ります。

    CREATE TABLE sport_person(id INTEGER PRIMARY KEY, name1 TEXT, name2 TEXT, event TEXT, age INTEGER);
    

    sport_person

    id name1 name2 event age

    ※データは無し

     
  • INSERT文
  • テーブルにデータを登録するSQLコマンドです。
    データ登録時の基本構文は以下の通りです。

    INSERT INTO テーブル名(カラム名リスト) VALUES(値リスト);
    

    先に示したテーブルに「60歳のバスケットボールの選手、雨宮太郎さん」を登録したい場合は以下のように記述します。

    INSERT INTO sport_person(name1, name2, event, age) VALUES('雨宮', '太郎', 'バスケットボール', 60);
    

    sport_person

    id name1 name2 event age
    1 山田 一郎 ゴルフ 10
    2 鈴木 NULL 野球 20
    3 佐藤 三郎 フィギュアスケート 30
    4 田中 四郎 ゴルフ 40
    5 村田 五郎 サッカー 50
    6 雨宮 太郎 バスケットボール 60
     
     
  • SELECT文
  • テーブルからデータを取り出す(参照する)SQLコマンドです。
    データ参照時の基本構文は以下の通りです。

    SELECT カラム名リスト FROM テーブル名 WHERE 検索条件 ORDER BY 並び替え条件;
    

    ※WHERE句、ORDER BY句は省略可能です。
    WHERE句を設定しない場合、テーブル内の指定した列がすべて参照されます。
    ORDER BY句は「カラム ASC」とするとそのカラムの昇順となり、「カラム名 DESC」とするとせおのカラムの降順となります。ASCやDESCおw省略した場合は昇順となります。

    先に示したテーブルのeventカラムが「ゴルフ」である人の、name1カラムを参照したい場合は次のように記述します。

    SELECT name1 FROM sport_person WHERE event = 'ゴルフ' ORDER BY name1 ASC;
    

    sport_person

    name1
    田中
    山田
     
     
  • UPDATE文
  • テーブル内のデータを更新するSQLコマンドです。
    データ更新時の基本構文は以下の通りです。

    UPDATE テーブル名 SET 列名 = 値リスト WHERE 更新条件;
    

    ※WHERE句は省略可能ですが、条件を設定しない場合、テーブル内の指定した列がすべて更新されます。

    先に示したテーブルで、鈴木さんのeventを「野球」から「ベースボール」に変更したい場合は次のように記述します。

    UPDATE sport_person SET event = 'ベースボール' WHERE id = 2;
    

    sport_person

    id name1 name2 event age
    1 山田 一郎 ゴルフ 10
    2 鈴木 NULL ベースボール 20
    3 佐藤 三郎 フィギュアスケート 30
    4 田中 四郎 ゴルフ 40
    5 村田 五郎 サッカー 50
    6 雨宮 太郎 バスケットボール 60
     
     
  • DELETE文
  • テーブルからデータを削除するSQLコマンドです。
    データ削除時の基本構文は以下の通りです。

    DELETE FROM テーブル名 WHERE 削除条件;
    

    ※WHERE句は省略可能ですが、条件を設定しない場合、テーブル内のデータはすべて削除されます。

    先に示したテーブルから「村田五郎さん」のデータを削除したい場合は次のように記述します。

    DELETE FROM sport_person WHERE name1 = '村田';
    

    sport_person

    id name1 name2 event age
    1 山田 一郎 ゴルフ 10
    2 鈴木 NULL ベースボール 20
    3 佐藤 三郎 フィギュアスケート 30
    4 田中 四郎 ゴルフ 40
    6 雨宮 太郎 バスケットボール 60
 
 

以上がSQLiteデータベースとSQLの概要です。
次のCHAPTERでは、SQLiteOpenHelperクラスとSQLiteDatabaseクラスについて解説します。

Androidアプリ開発の必須知識!JAVAプログラミングを学べる連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search