0Pricing
Android Academy · レッスン

Room Database

Roomを使って構造化データをローカルに保持します。Entity、DAO、Databaseクラスを定義し、SQLでクエリを実行して、LiveDataまたはFlowで結果を監視します。

「Room Database」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン2/6です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全6レッスンが含まれています。

Roomとは

Roomは、Android向けにGoogleが推奨している永続化ライブラリです。SQLiteをラップし、次の機能を提供します。

  • コンパイル時に検証される型安全なSQLクエリ
  • Kotlinコルーチンのサポート
  • LiveData / Flowとの統合
  • スキーマ変更のためのマイグレーションサポート

Roomの3つのコンポーネント

Roomは3つのアノテーションを中心に構成されます。

  • @Entity — データベーステーブルに対応するデータクラス
  • @Dao(Data Access Object) — SQLクエリを持つインターフェース
  • @Database — すべてを結び付けるメインデータベースクラス

Room依存関係の追加

app/build.gradleにRoomを追加します。

// app/build.gradle
plugins {
    id 'kotlin-kapt'  // needed for Room annotation processor
}

dependencies {
    val roomVersion = "2.6.1"
    implementation "androidx.room:room-runtime:$roomVersion"
    kapt "androidx.room:room-compiler:$roomVersion"
    implementation "androidx.room:room-ktx:$roomVersion" // coroutine support
}

Entityの定義

データベーステーブルを作成するには、データクラスに@Entityを付けます。

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "notes")
data class Note(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    val title: String,
    val body: String,
    val createdAt: Long = System.currentTimeMillis()
)

// Each field = one column in the database table
// @PrimaryKey autoGenerate = Room assigns the id automatically

DAOの作成

DAOインターフェースにクエリを定義します。実装はRoomが自動生成します。

import androidx.room.*
import kotlinx.coroutines.flow.Flow

@Dao
interface NoteDao {

    @Query("SELECT * FROM notes ORDER BY createdAt DESC")
    fun getAllNotes(): Flow<List<Note>>  // emits new list whenever data changes

    @Query("SELECT * FROM notes WHERE id = :noteId")
    suspend fun getNoteById(noteId: Int): Note?

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(note: Note)

    @Update
    suspend fun update(note: Note)

    @Delete
    suspend fun delete(note: Note)
}

データベースの作成

@DatabaseクラスはRoomへのエントリーポイントです。一度構築したら、シングルトンとして保持します。

import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context

@Database(entities = [Note::class], version = 1, exportSchema = false)
abstract class NoteDatabase : RoomDatabase() {

    abstract fun noteDao(): NoteDao

    companion object {
        @Volatile private var INSTANCE: NoteDatabase? = null

        fun getInstance(context: Context): NoteDatabase {
            return INSTANCE ?: synchronized(this) {
                Room.databaseBuilder(
                    context.applicationContext,
                    NoteDatabase::class.java,
                    "note_database"
                ).build().also { INSTANCE = it }
            }
        }
    }
}

ViewModelでのRoomの使用

コルーチンを使って、ViewModelにDAOを接続します。

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch

class NoteViewModel(private val dao: NoteDao) : ViewModel() {

    val notes = dao.getAllNotes()  // Flow — auto-updates when DB changes

    fun addNote(title: String, body: String) {
        viewModelScope.launch {
            dao.insert(Note(title = title, body = body))
        }
    }

    fun deleteNote(note: Note) {
        viewModelScope.launch {
            dao.delete(note)
        }
    }
}

UIでのRoomデータの監視

ActivityまたはFragmentでRoomからのFlowを収集します。

import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch

class NoteActivity : AppCompatActivity() {
    private val viewModel: NoteViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...

        lifecycleScope.launch {
            viewModel.notes.collect { notes ->
                adapter.submitList(notes)  // update RecyclerView
            }
        }
    }
}

データベースのマイグレーション

Entityを変更する場合(列の追加やテーブル名の変更など)、既存のユーザーデータが失われないようにマイグレーションを用意する必要があります。

@Database(version = 2)のバージョン番号を増やし、古いスキーマを新しいスキーマに変換するSQLを記述したMigrationオブジェクトを定義します。

理解度チェック

インターフェースメソッドをSQLのSELECTクエリとして指定するRoomのアノテーションはどれですか?

まとめ:Roomデータベース

これで、ローカルデータを永続化するアプリを構築できるようになりました。

  • @Entity — データクラス → データベーステーブル
  • @Dao — @Query、@Insert、@Deleteを持つインターフェース
  • @Database — シングルトンのエントリーポイント
  • DAOからFlow<List>を返して、最新の更新を受け取る
  • viewModelScope.launchを使い、ViewModelからDAOを呼び出す

次は、コールバックを使わずにCoroutinesで非同期コードを記述します。

よくある質問

「Room Database」レッスンは無料ですか?

はい。「Room Database」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全6レッスンが含まれています。

「Room Database」で何を学びますか?

Roomを使って構造化データをローカルに保持します。Entity、DAO、Databaseクラスを定義し、SQLでクエリを実行して、LiveDataまたはFlowで結果を監視します。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/6です。

「Room Database」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ViewModelとLiveData
  2. Room Database
  3. コルーチンとSuspend関数
  4. Repositoryパターン
  5. Navigation Component
  6. Hiltによる依存性注入
← Android Academyに戻る