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 automaticallyDAOの作成
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フィードバックを取得できます。ローカル設定は不要です。