Androidは標準でSQLiteというRDBMS(Relational Database Management System)を扱います。
SQLiteは少し個性的なデータベースです。
データベース全般の説明を通して、SQLiteと他の違いをまとめます。
※環境:Android Studio Ladybug | 2024.2.1 Patch 2
Kotlin 2.0.0
目次
データベースとは
アプリケーションで扱うデータをファイルへ入出力することは、よくある動作です。
この時、後々のデータの読み書きを考えると、ファイルは定まったフォーマットにします。なぜなら、不明なフォーマットで書き込まれていたら、データが正しく読み込めないからです。
フォーマットはアプリケーション固有のもの、XML・TOMLといったテキストのもの、JPEG・PNG(画像)といったバイナリのものなど、様々です。
※TOML:Gradleのバージョンカタログで使用
データベースもフォーマットの一種で、テーブル(二次元の表)を用いてデータを表現したバイナリです。
RDBMS
コンピューターの世界で単にデータベースというと、一般的に「RDBMS」を指します。
「DB」は「データベース(DataBase)」の略です。その他は次のような意味になります。
MS(Management System)
「MS」は「マネージメントシステム(Management System:管理システム)」の略です。
マネージメントシステムの役割は次の2つになります。
- ・データベースの管理
- ・操作手段の提供
マネージメントシステムに役割を任せることで、データベースはプロラム(アプリケーション)からブラックボックスとして扱えます。
プログラムはデータの実装を知らなくても、データにアクセスできます。つまり、プロブラムとデータを分離できます。
データベースの管理
マネージメントシステムはデータベースの管理を行います。
管理項目 | 概要 |
---|---|
データの保守 | 無駄を省くためにデータの空きを詰める アクセス効率化のためにデータを並び替える |
データのバックアップ(※) | 定期的なバックアップで障害からデータを守る |
セキュリティの維持(※) | 正当なユーザーにアクセスを制限する |
排他制御 | 同時多発的なアクセスからデータの矛盾を防ぐ |
トランザクション制御 | アクセス途中で発生した障害からデータの整合性を守る |
※ユーザにより設定されている場合 |
操作手段の提供
マネージメントシステムはデータベースの操作手段(問い合わせ、返答)をユーザーに提供します。
代表的な問い合わせを以下にあげます。
- ・登録(INSERT)
- ・検索(SELECT)
- ・削除(DELETE)
- ・変更(UPDATE) ※( )はSQLの構文
データベースの問い合わせに特化したSQL(Structured Query Language)言語があり、SQLの利用が業界標準となっています。
SQLを使って問い合わせを行うことで、どんなプログラミング言語や開発環境からでも、同じ形式で操作が出来ます。
R(Relational)
「R」は「リレーショナル(Relational:関係)」の略です。
データベースは複数のテーブルを持つことが出来ます。そして、お互いに関連(Relationship:相互関連)付けが行えます。
例えば、「価格テーブル」を関連付けされた複数のテーブルで表現すると、次のようになります。
リレーションシップを行う目的はデータ(黒字の部分)の冗長性を減らすことです。
これにより、「ドラッグストア〇〇」が「ドラッグストア◎◎」へ変わったとしても、【店舗テーブル】のみを修正するだけで済みます。
ちなみに、単独のテーブルを関連付けされた複数のテーブルへ変換する処理を「正規化」と呼びます。
SQLiteが標準
RDBMSで有名なシステムは「MySQL」と「PostgreSQL」です。
この2つは、大規模なデータに耐えられる機能と性能を持つ上にOSSなので、利用者が多いです。
2つを紹介しましたが…
Android SDKで提供されるデータベースAPIは「SQLite」を対象にしたものです。SQLiteがAndroidの標準データベースになります。
SQLiteのSQLはサブセットですが、主要なコマンドは揃っているので、標準的な利用であれば問題ありません。
RDBMS | システム構成 | SQL | その他 |
---|---|---|---|
MySQL | サーバー&クライアント | フルセット | OSS |
PostgreSQL | |||
SQLite | アプリケーション組み込み | サブセット | |
※MySQLの開発元はORACLE ※MySQLは無償版(MySQL Community Server)と商用版がある ※OSS:Open Source Softwear |
前者の2つとSQLiteは、システム構成に大きな違いがあります。
MySQLとPostgreSQLのシステム構成
システム構成はサーバー&クライアントモデルです。データベースはネットワークを介したサーバーに存在します。
クライアントは、ネットワークを使ってサーバーへSQLコマンドで問い合わせ、ネットワークを使ってサーバーから返答を取得します。
SQLiteのシステム構成
システム構成はアプリケーション組み込みです。データベースは同一ホスト内に存在します。Androidの場合はサンドボックス内(内部ストレージ)に作られます。
Android SDKのデータベースAPIがSQLiteの仕様に準拠したものとなっており、APIを用いれば自ずとサンドボックス内のデータベースへアクセスできます。
なお、Androidにおいても、KotlinのデータベースAPIを用いることで、MySQLやPostgreSQLへアクセスが可能と思われます。利用した経験はありませんが…
永続性の確保
プログラムは、動作の途中で生成したデータを何処かに保存しつつ、処理を進めます。
そして、データの寿命(有効な範囲)は保存する場所により決まります。
保存場所 | データの寿命 | 永続性 | 例 | |
---|---|---|---|---|
関数のローカル変数 | ・代入~関数の終了 | |||
クラスのプロパティ | ・インスタンスが存在する間 | Activity ViewModel Application |
||
ファイル | 内部ストレージ (サンドボックス) | ・意図的に削除されるまで ・アプリが削除されるまで | SharedPreferences Database |
|
外部ストレージ | ・意図的に削除されるまで | カメラアプリで撮った写真 |
この中で、アプリケーションが終了しても消えない保存場所を「永続性:あり」、消える保存場所を「永続性:なし」と言います。
また、永続性の必要なデータを「永続データ」を読んでいます。例えば、曲の再生リスト、ToDoリストの項目などは永続データです。
データベースはファイルに記録されるので、永続データの保存に適しています。
データベース(SQLite)の構築方法
Androidが標準で扱うデータベースはSQLiteです。
Androidでデータベースを構築する方法は「SQLite API(Android SDK)」と「Room(Android Jetpack)」の2通りがあります。
SQLite API
「SQLite API」はAndroid SDKで提供されているAPIです。API Level 1の頃からあります。
データベースと接続を確立(Open)した時に得られる識別子(SQLiteDatabase)を介して、マネージメントシステムへSQLを発行し、データベースにアクセスします。
※構築方法の詳細は「SQLite APIでデータベースを構築」を参照
Room
「Room」はAndroid Jetpackで提供されているAPIです。「SQLite API」に代わって、使用が推奨されています。
アノテーションとKotlinの構文を使って、データベースのアクセスモデル(設計図)を記述し、それを基にシンボルプロセッサがアプリ専用APIを構築します。
専用APIから取り出された識別子(RoomDatabase)のDao(Data Access Object)を介して、マネージメントシステムへSQLを発行し、データベースにアクセスします。
※構築方法の詳細は「Roomでデータベースを構築」を参照
関連記事: