カテゴリ: Kotlin 更新日: 2026/01/02

KotlinのCursorとContentProviderの基礎を完全解説!初心者でもわかるデータ取得の仕組み

KotlinのCursorやContentProviderの基礎知識をおさらい
KotlinのCursorやContentProviderの基礎知識をおさらい

先生と生徒の会話形式で理解しよう

生徒

「Kotlinで連絡先や画像など、スマホに入ってるデータをアプリから取り出すことってできますか?」

先生

「できますよ。そのときに使うのがContentProvider(コンテントプロバイダー)とCursor(カーソル)という仕組みです。」

生徒

「聞いたことあるけど、よく分かりません…どんな役割なんですか?」

先生

「それじゃあ、KotlinでのContentProviderとCursorの基礎を一緒におさらいしてみましょう!」

1. ContentProvider(コンテントプロバイダー)とは?

1. ContentProvider(コンテントプロバイダー)とは?
1. ContentProvider(コンテントプロバイダー)とは?

ContentProviderとは、Androidが提供する「他のアプリやシステムのデータにアクセスするための窓口」のことです。

例えば、連絡先・カレンダー・画像・動画・SMSなどのデータは、直接は触れません。その代わりに、ContentProviderを通じて安全にアクセスできるようになっています。

このように、ContentProviderはアプリ間でデータを共有するための仲介役なのです。

2. Cursor(カーソル)とは?

2. Cursor(カーソル)とは?
2. Cursor(カーソル)とは?

Cursorは、データベースの中の情報を一行ずつ取り出すための道具です。

たとえるなら、図書館のカード目録のようなもの。データがズラッと並んでいて、必要な1行ずつを順番に取り出して読むことができます。

Kotlinでは、ContentProviderからデータを取得したとき、結果はCursorの形で返されます。

3. KotlinでContentProviderからデータを取得する基本コード

3. KotlinでContentProviderからデータを取得する基本コード
3. KotlinでContentProviderからデータを取得する基本コード

たとえば、スマホに保存されている画像一覧を取り出すには、以下のようなコードを書きます。


val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME)

val cursor = contentResolver.query(
    uri,
    projection,
    null,
    null,
    "${MediaStore.Images.Media.DATE_ADDED} DESC"
)

cursor?.use {
    val idColumn = it.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
    val nameColumn = it.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)

    while (it.moveToNext()) {
        val id = it.getLong(idColumn)
        val name = it.getString(nameColumn)
        // ここで画像IDや名前を使った処理をする
    }
}

4. URIとは?ContentProviderの住所のようなもの

4. URIとは?ContentProviderの住所のようなもの
4. URIとは?ContentProviderの住所のようなもの

uriは、取得したいデータがどこにあるのかを指定する「住所」のようなものです。画像ならMediaStore.Images.Media.EXTERNAL_CONTENT_URIを使います。

連絡先を取得したいときは別のURI、カレンダーならまた別のURIが使われます。

5. projectionとは?欲しいデータだけを選ぶ

5. projectionとは?欲しいデータだけを選ぶ
5. projectionとは?欲しいデータだけを選ぶ

projectionは、「どのカラム(列)の情報がほしいか」を指定するものです。

たとえば、画像のIDとファイル名だけ欲しいなら、次のように書きます。


val projection = arrayOf(
    MediaStore.Images.Media._ID,
    MediaStore.Images.Media.DISPLAY_NAME
)

6. query関数の仕組み

6. query関数の仕組み
6. query関数の仕組み

contentResolver.query() は、ContentProviderに問い合わせをして、指定した情報をCursorの形で返してくれる関数です。

  • 第1引数: どのデータを取るか(URI)
  • 第2引数: どの列を取るか(projection)
  • 第3~4引数: 絞り込み条件(今回はなし)
  • 第5引数: 並び順(今回は新しい順)

7. Cursorの読み取り方と注意点

7. Cursorの読み取り方と注意点
7. Cursorの読み取り方と注意点

Cursorは、必ずwhile (it.moveToNext())で繰り返し処理をします。これにより、すべてのデータを1行ずつ順番に取り出すことができます。

そして、忘れてはいけないのがcursor?.use { ... }の形。これは、データを読み終えたら自動で閉じてくれる便利な書き方です。メモリの無駄遣いを防ぎます。

8. ContentProviderを使うときのパーミッションに注意

8. ContentProviderを使うときのパーミッションに注意
8. ContentProviderを使うときのパーミッションに注意

ContentProviderで画像や連絡先にアクセスするには、AndroidManifestにパーミッションを追加する必要があります。例えば画像を読む場合:


<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

また、Android 10以降はScoped Storage(スコープ付きストレージ)という新しいルールがあるため、アクセス制限にも注意しましょう。

9. ContentProviderはRoomとは別物

9. ContentProviderはRoomとは別物
9. ContentProviderはRoomとは別物

初心者が混乱しがちなのが、RoomとContentProviderの違いです。

Roomは自分のアプリ内で使うデータベース。

ContentProviderは他のアプリやシステムからデータを取得するための仕組み。

つまり、ContentProviderは「他人の家のデータを安全に見るための窓口」のようなものなんです。

関連記事:
カテゴリの一覧へ
新着記事
New1
Go言語
Go言語のオブジェクト指向の特徴を完全ガイド!初心者でも理解できる他言語との違い
New2
Go言語
Go言語の条件分岐の見やすい書き方を徹底解説!初心者でもわかるif文の使い方
New3
Kotlin
Kotlinのクラス設計に役立つベストプラクティスまとめ|初心者でもわかるクラス設計の考え方
New4
Kotlin
Kotlinでアーキテクチャ設計の基本!MVC・MVP・MVVMの違いを解説
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語の関数パラメータ!値渡しと参照渡しの違いを理解しよう
No.2
Java&Spring記事人気No2
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.3
Java&Spring記事人気No3
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.4
Java&Spring記事人気No4
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.5
Java&Spring記事人気No5
Kotlin
Kotlinのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.6
Java&Spring記事人気No6
Go言語
Go言語のWebアプリにおけるセキュリティベストプラクティス集
No.7
Java&Spring記事人気No7
Kotlin
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
No.8
Java&Spring記事人気No8
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!