ViewModel+Room+Lifecycle 整合示例
1. 添加依赖项 (build.gradle)
// 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"https://www.zhihu.com/zvideo/1993918289781465759/
https://www.zhihu.com/zvideo/1993918289781465759
https://www.zhihu.com/zvideo/1993918287927591530/
https://www.zhihu.com/zvideo/1993918287927591530
https://www.zhihu.com/zvideo/1993918287759824289/
https://www.zhihu.com/zvideo/1993918287759824289
https://www.zhihu.com/zvideo/1993918278268110360/
https://www.zhihu.com/zvideo/1993918278268110360
https://www.zhihu.com/zvideo/1993918276913340630/
https://www.zhihu.com/zvideo/1993918276913340630
https://www.zhihu.com/zvideo/1993918272425435359/
https://www.zhihu.com/zvideo/1993918272425435359
https://www.zhihu.com/zvideo/1993918270097609320/
https://www.zhihu.com/zvideo/1993918270097609320
https://www.zhihu.com/zvideo/1993918268155643305/
https://www.zhihu.com/zvideo/1993918268155643305
https://www.zhihu.com/zvideo/1993918267471979608/
https://www.zhihu.com/zvideo/1993918267471979608
https://www.zhihu.com/zvideo/1993918243790951547/
https://www.zhihu.com/zvideo/1993918243790951547
2. 创建实体类 (User.kt)
@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)
@Dao interface UserDao { @Insert suspend fun insert(user: User) @Query("SELECT * FROM users") fun getAllUsers(): LiveData<List<User>> }4. 创建数据库类 (AppDatabase.kt)
@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)
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)
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)
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)
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组件确保数据观察只在活动处于活动状态时进行,避免内存泄漏。