Todo
エンティティを定義します。このエンティティはデータベーステーブルにマップされる
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity
data class Todo(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val title: String,
val description: String,
val isDone: Boolean
)
DAO インターフェースを作成。このインターフェースは、データベースアクセス用のメソッドを定義
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
@Dao
interface TodoDao {
@Query("SELECT * FROM todo")
fun getAllTodos(): List<Todo>
@Query("SELECT * FROM todo WHERE id = :id")
fun getTodoById(id: Int): Todo
@Insert
fun insertAll(vararg todos: Todo)
@Update
fun updateTodo(todo: Todo)
@Delete
fun delete(todo: Todo)
}
データベースインスタンス
import androidx.room.Database
import androidx.room.RoomDatabase
@Database(entities = [Todo::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun todoDao(): TodoDao
}
コンポーネントを Jetpack Compose UI と統合
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.room.Room
import android.app.Application
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.Modifier
@Composable
fun TodoApp(todoViewModel: TodoViewModel = viewModel()) {
val todos by todoViewModel.todos.collectAsState(initial = emptyList())
Scaffold(
topBar = { TopAppBar(title = { Text("TODO List") }) },
content = {
Column {
for (todo in todos) {
TodoItem(todo = todo)
}
}
}
)
}
@Composable
fun TodoItem(todo: Todo) {
Row(modifier = Modifier.fillMaxWidth()) {
Checkbox(
checked = todo.isDone,
onCheckedChange = { /* Handle check change */ }
)
Text(text = todo.title)
}
}
// ViewModel は、UI とデータベース層をつなぐ役割
class TodoViewModel(application: Application) : AndroidViewModel(application) {
private val db = Room.databaseBuilder(
application,
AppDatabase::class.java, "database-name"
).build()
// データベースからTODOリストを取得する
val todos = db.todoDao().getAllTodos().asLiveData()
}