ViewModel+Room+Lifecycle 整合示例
1. 添加依赖项 (build.gradle)
kotlin
// Room
implementation "androidx.room:room-runtime:2.4.3"
kapt "androidx.room:room-compiler:2.4.3"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
2. 创建实体类 (User.kt)
kotlin
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
@ColumnInfo(name = "user_name") val name: String,
@ColumnInfo(name = "user_email") val email: String
)
3. 创建DAO接口 (UserDao.kt)
kotlin
@Dao
interface UserDao {
@Insert
suspend fun insert(user: User)
@Query("SELECT * FROM users")
fun getAllUsers(): LiveData<List<User>>
}
4. 创建数据库类 (AppDatabase.kt)
kotlin
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database"
).build()
INSTANCE = instance
instance
}
}
}
}
5. 创建Repository (UserRepository.kt)
kotlin
class UserRepository(private val userDao: UserDao) {
val allUsers: LiveData<List<User>> = userDao.getAllUsers()
suspend fun insert(user: User) {
userDao.insert(user)
}
}
6. 创建ViewModel (UserViewModel.kt)
kotlin
class UserViewModel(application: Application) : AndroidViewModel(application) {
private val repository: UserRepository
val allUsers: LiveData<List<User>>
init {
val userDao = AppDatabase.getDatabase(application).userDao()
repository = UserRepository(userDao)
allUsers = repository.allUsers
}
fun insert(user: User) = viewModelScope.launch {
repository.insert(user)
}
}
7. Activity中使用 (MainActivity.kt)
kotlin
class MainActivity : AppCompatActivity() {
private lateinit var userViewModel: UserViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
// 观察数据变化
userViewModel.allUsers.observe(this, Observer { users ->
users?.let {
// 更新UI
recyclerView.adapter = UserAdapter(users)
}
})
// 添加新用户
addButton.setOnClickListener {
val user = User(name = "John", email = "john@example.com")
userViewModel.insert(user)
}
}
}
8. 创建RecyclerView适配器 (UserAdapter.kt)
kotlin
class UserAdapter(private val users: List<User>) :
RecyclerView.Adapter<UserAdapter.UserViewHolder>() {
class UserViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val name: TextView = itemView.findViewById(R.id.tvName)
val email: TextView = itemView.findViewById(R.id.tvEmail)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.user_item, parent, false)
return UserViewHolder(view)
}
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
val current = users[position]
holder.name.text = current.name
holder.email.text = current.email
}
override fun getItemCount() = users.size
}
这个实现展示了如何将ViewModel与Room数据库结合使用,并通过LiveData自动更新UI。Lifecycle组件确保数据观察只在活动处于活动状态时进行,避免内存泄漏。