SQLiteはMySQLやOracleのようなデータベース管理システムで、クライアントサーバー型ではなくライブラリの形で利用できる軽量のデータベースであり、データは全て1つのファイルに保存されます。
一般的なRDBMS(リレーショナルデータベース管理システム)に比べて大量のデータの扱いには向きませんが、全プログラムを合わせても600kb前後なので、アプリケーションローカルで使用するデータベースエンジンとしては非常に合理的に作られているといえるでしょう。
また標準で搭載しているデータ型が整数型(INTEGER)、浮動小数型(REAL)、文字列型(TEXT)、無制限スカラ型(BLOB)の4種類しかないことも特徴的です。
作成したデータベースはアプリケーションのどのクラスからでもアクセスできますが、他のアプリケーションからはアクセスできません。
データベースファイルは次ののディレクトリに保存されます。
/data/data/パッケージ名/databases/
プリファレンスと同様に、root化された端末では、他のアプリケーションのデータベースへアクセス可能となります。また、アプリケーションを削除するとすべてのデータが破棄されます。
下図のようにデータベースの中には、複数のテーブルが存在することが可能です。
テーブルに関しては後ほど解説します。
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は下表に記載のあるデータ定義言語(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コマンド |
例えば、AさんがBさんに銀行ATMで¥1,000振り込むとします。
もしAさんの振込処理が完了し、Bさんの口座に入金処理が反映する前に、システム障害が発生したらどうなるでしょう?Aさんの口座の残高は¥1,000減りますが、Bさんの口座の残高は¥1,000増えていないということになります。これでは困りますね。
そこでトランザクションの登場です。
振込処理を1つのトランザクションとして扱い、『Aさんの口座残高を¥1,000減らし、Bさんの口座残高を¥1,000増やす』という一連の処理が完了するまでは、データベース内に保存されているデータを更新しない、とすれば問題は解決できます。
このような一連の処理の流れをトランザクション処理と呼びます。
下表はテーブルとテーブル内に存在するデータのイメージです。
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制約を設定したカラムのデータ型がINTEGERの場合、自動的に連続する数値が割り振られます。次のように記述します。
CREATE TABLE テーブル名(カラム名 INTEGER PRIMARY KEY, …);
- CREATE文
- INSERT文
- SELECT文
- UPDATE文
- DELETE文
オブジェクトを作成する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 |
---|---|---|---|---|
※データは無し
テーブルにデータを登録する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 |
テーブルからデータを取り出す(参照する)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 |
---|
田中 |
山田 |
テーブル内のデータを更新する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 |
テーブルからデータを削除する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クラスについて解説します。