Imagesデータのデータベースによる管理(API≦28)

投稿日:  更新日:

メディアデータはデータベースによって管理されています。

Media Store APIを使ってメディアデータへアクセスしているのであれば、データベースの所在や構成などを意識する必要はありません。

ただ、「より複雑な制御をしたい場合」や「デバックを効率化したい場合」などに、データベースの知識が役立ちます。

今回は「メディアデータのデータベースによる管理」について、まとめます。

この記事は、Imagesデータ編です。

※環境:Android Studio Narwhal | 2025.1.1 Patch 1

スポンサーリンク

データベースの所在

メディアデータのメディア情報を、データベースで管理しているのはMedia Storeアプリです。

ですので、データベースは内部ストレージのMedia Storeアプリ固有の領域にあります。

# pwd
/data/data/com.android.providers.media       ← Media Storeアプリ固有の領域
# ls -l databases/*
-rw-rw---- 1 u0_a5 u0_a5 151552 2025-06-05 01:52 databases/external.db
-rw-rw---- 1 u0_a5 u0_a5 229376 2025-06-05 00:01 databases/internal.db

※「/data/data」は管理者ユーザー(ユーザーID:0)の内部ストレージと同じ場所
スポンサーリンク

テーブルの構成

データベースは複数のテーブルで構成されています。

# pwd
/data/data/com.android.providers.media/databases
# sqlite3 ./external.db
sqlite> .tables
album_art              audio_genres           log
album_info             audio_genres_map       search
albums                 audio_genres_map_noid  searchhelpertitle
android_metadata       audio_meta             thumbnails
artist_info            audio_playlists        video
artists                audio_playlists_map    videothumbnails
artists_albums_map     files
audio                  images

メディア情報の実態は、filesテーブルが持ちます。

imagesテーブルはfilesテーブルからimageメディア情報を切り出したview(仮想テーブル)です。

MediaStoreのデータベースのテーブル

viewテーブルの条件に、media_typeカラム(media_type=1)が用いられています。

...
db.execSQL("CREATE TABLE files (_id INTEGER PRIMARY KEY AUTOINCREMENT,"
     + "_data TEXT UNIQUE COLLATE NOCASE,_size INTEGER,format INTEGER,parent INTEGER,"
     + "date_added INTEGER,date_modified INTEGER,mime_type TEXT,title TEXT,"
     + "description TEXT,_display_name TEXT,picasa_id TEXT,orientation INTEGER,"
     + "latitude DOUBLE,longitude DOUBLE,datetaken INTEGER,mini_thumb_magic INTEGER,"
     + "bucket_id TEXT,bucket_display_name TEXT,isprivate INTEGER,title_key TEXT,"
     + "artist_id INTEGER,album_id INTEGER,composer TEXT,track INTEGER,"
     + "year INTEGER CHECK(year!=0),is_ringtone INTEGER,is_music INTEGER,"
     + "is_alarm INTEGER,is_notification INTEGER,is_podcast INTEGER,album_artist TEXT,"
     + "duration INTEGER,bookmark INTEGER,artist TEXT,album TEXT,resolution TEXT,"
     + "tags TEXT,category TEXT,language TEXT,mini_thumb_data TEXT,name TEXT,"
     + "media_type INTEGER,old_id INTEGER,is_drm INTEGER,"
     + "width INTEGER, height INTEGER, title_resource_uri TEXT)");

db.execSQL("CREATE VIEW images AS SELECT _id,_data,_size,_display_name,mime_type,title,"
     + "date_added,date_modified,description,picasa_id,isprivate,latitude,longitude,"
     + "datetaken,orientation,mini_thumb_magic,bucket_id,bucket_display_name,width,"
     + "height FROM files WHERE media_type=1");
...
スポンサーリンク

カラムの構成

テーブルおよびコレクションは次のカラムを持ちます。

データベースの
filesテーブル
データベースの
imagesテーブル
MediaStoreの
imagesコレクション
コメント
_idI_id左に同じPrimary Key
Autoinc
_dataT_dataUnigue
_display_nameT_display_name
_sizeI_size
albumT
album_artistT
album_idI
artistT
artist_idI
bookmarkI
bucket_display_nameTbucket_display_name
bucket_idTbucket_id
categoryT
composerT
date_addedIdate_added
date_modifiedIdate_modified
datetakenIdatetaken
descriptionTdescription
durationI
formatI
heightIheight
is_alarmI0:false
1:true
is_drmI
is_musicI
is_notificationI
is_podcastI
is_ringtoneI
isprivateIisprivate
languageT
latitudeDlatitude
longitudeDlongitude
media_typeI1:Images
2:Audio
3:Video
mime_typeTmime_type
mini_thumb_dataT
mini_thumb_magicImini_thumb_magic
nameT
old_idI
orientationIorientation
parentI
picasa_idTpicasa_id
resolutionT
tagsT
titleTtitle
title_keyT
title_resource_uriT
trackI
widthIwidth
yearI
※カラム名はA-Z順にソート
※I:Integer、R:Real、D:Double、T:Text、B:BLOB(Binary)
※imageコレクション:Media Storeで操作可能なカラム(参照結果のCursorに含まれる)

Media Store APIはカラム名をパラメータで定義しています。プログラムは、このパラメータを使います。※詳細は「MediaStore.Images.Media.*」を参照

スポンサーリンク

レコードの構成

レコード(メディア情報)内のフィールドは、次のような関係があります。

  • (1)URIを指定すると、_idが定まる
  • (2)_idを指定すると、メディア情報が一意に定まる
  • (3)メディア情報の_dataを指定すると、メディアファイルが一意に定まる

(3)の_dataとファイルの物理的な関係は「固定」です。

関係が崩れると、Media Storeは破綻します。つまり、データを読み出したり、更新したり、といった正常なアクセスが出来なくなります。

レコードの構成

これに対し、_data以外とファイルの物理的な関係は「なし」です。

これらのフィールドはメディアファイルのメタ情報であって、関係が崩れたとしても、Media Storeは破綻しません。ただし、論理的な関係は維持しないと、メタ情報の意味がありません。

例えば、ファイル名を連番(_data:/…/IMG0011.jpg)、表示名を具体的な名前(_display_name:「100万ドルの夜景」)などにすることが出来ます。

また、MIMEタイプを”image/jpeg”⇒”image/png”にすると、読み出しは問題ありませんが、PNGフォーマットと信じたアプリは表示に失敗します。

スポンサーリンク

関連記事:

ストレージのリソースは、内部メモリー、外部メモリー、クラウドの3つがあります。 外部メモリーは、主にSDカードです。 このSDカードはAndroid端末の世代が進むにつれて、扱いを変えてきました。 リソースとSDカードを主眼に置いたストレージの変遷について、まとめます。 ※環境:Android Studio Narwhal | 2025.1.1 Patch 1 ...
Adoptable Storage(API≧23、Android 6.0)が導入されて、SDカードの扱い方をユーザ側で指定できるようになりました。 「Adoptable Storage」について、まとめます。 ※環境:Android Studio Narwhal | 2025.1.1 Patch 1 ...
ストレージはデータの用途別に記憶領域が分けられます。 保存先を守らないと、セキュリティリスクが発生したり、他のアプリと協調した動作が出来なくなったり、します。 ですので、適切な場所へデータを保存しましょう。 今回は「用途別記憶領域とボリューム」について、まとめます。 ※環境:Android Studio Narwhal | 2025.1.1 Patch 1 ...
ストレージへアクセスする方法は、「扱うデータの種類」「アクセス先」「セキュリティの確保」などの要件により、最適なアクセス方法が存在するので、使い分けが必要です。 今回は「アクセスする方法」について、まとめます。 ※環境:Android Studio Narwhal | 2025.1.1 Patch 1 ...
「内部ストレージ」にアクセスする方法について、まとめます。 「内部ストレージ」は、セキュリティが高いうえに、端末の内部メモリーに構築されるので、必ず存在します。 使いたい時に安心して使え、もっとも使い勝手のよいストレージと言えます。 アプリのデータを保存したいならば、保存先として真っ先に考えるストレージです。 ※環境:Android Studio Narwhal | 2025.1.1 Patch 1 ...
外部ストレージへアクセスするアプリは、パーミッション(許可)をユーザーから取得する必要があります。 パーミッションを得たアプリは、許可された権限の範囲内で、ストレージへアクセスが可能です。 これらは、ユーザーデータのプライバシー保護と密接に関係しています。 プライバシー保護をより強固にするために、パーミッションと権限の範囲の仕様は改変されてきました。 今回は、改変の歴史を辿りつつ、「パーミッションと権限の範囲」について、まとめます。 ※環境:Android Studio Narwhal | 2025.1.1 Patch 1 ...
「外部ストレージ_プライマリ」にアクセスする方法について、まとめます。 「外部ストレージ_プライマリ」は、アプリ間で共有するデータを保存するストレージです。 主にカメラ、音楽プレーヤー、動画プレーヤーで扱うデータを保存します。 「外部ストレージ_プライマリ」に保存したデータは、他のアプリに公開することになるので、秘匿性の高いデータの保存に適しません。 ※環境:Android Studio Narwhal | 2025.1.1 Patch 1 ...
「外部ストレージ_セカンダリ」にアクセスする方法について、まとめます。 「外部ストレージ_セカンダリ」は、デバイス間(または、アプリ間)で共有するデータを保存するストレージです。 デバイスとは、他の携帯端末やパソコンなどを指します。 ストレージがSDカードのような取り外し可能なリソース上に構築されているので、データの共有は取り外したストレージを他のデバイスへ取り付けて行います。 「外部ストレージ_セカンダリ」に保存したデータは、他のデバイスに公開することになるので、秘匿性の高いデータの保存に適しません。 ※環境:Android Studio Narwhal | 2025.1.1 Patch 1 ...
「外部ストレージ_プライマリ」に保存されるメディアデータは、Media Storeと呼ばれる特別な方法でアクセスします。 他の方法も可能ですが、Media Storeが最も適した方法です。 この「メディアデータへMedia Storeでアクセス」する方法を、まとめます。 この記事は、Imagesデータ編です。また、基本的なアクセス(読み書き)に的を絞って説明しています。 ※環境:Android Studio Narwhal | 2025.1.1 Patch 1 ...
「外部ストレージ_プライマリ」に保存されるメディアデータは、Media Storeと呼ばれる特別な方法でアクセスします。 他の方法も可能ですが、Media Storeが最も適した方法です。 この「メディアデータへMedia Storeでアクセス」する方法を、まとめます。 この記事は、Imagesデータ編です。また、基本的なアクセス(読み書き)に的を絞って説明しています。 ※環境:Android Studio Narwhal | 2025.1.1 Patch 1 ...
メディアデータはデータベースによって管理されています。 Media Store APIを使ってメディアデータへアクセスしているのであれば、データベースの所在や構成などを意識する必要はありません。 ただ、「より複雑な制御をしたい場合」や「デバックを効率化したい場合」などに、データベースの知識が役立ちます。 今回は「メディアデータのデータベースによる管理」について、まとめます。 この記事は、Imagesデータ編です。 ※環境:Android Studio Narwhal | 2025.1.1 Patch 1 ...
スポンサーリンク