news 2026/4/17 3:42:10

Android Jetpack 实战:ViewModel+Room+Lifecycle 教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android Jetpack 实战:ViewModel+Room+Lifecycle 教程

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组件确保数据观察只在活动处于活动状态时进行,避免内存泄漏。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 2:00:51

Khronos Vulkan® 教程

目录 版权声明&#xff08;Attribution&#xff09; 差异说明&#xff08;Differences&#xff09; 关于&#xff08;About&#xff09; 授权协议&#xff08;License&#xff09; 教程结构&#xff08;Tutorial structure&#xff09; 版权声明&#xff08;Attribution&am…

作者头像 李华
网站建设 2026/4/16 13:30:34

ResNet18应用开发:智能相册自动标签系统

ResNet18应用开发&#xff1a;智能相册自动标签系统 1. 背景与需求分析 1.1 智能相册的标签痛点 随着智能手机和数码相机的普及&#xff0c;用户每年拍摄的照片数量呈指数级增长。然而&#xff0c;大多数照片在拍摄后被简单地按时间排序存储&#xff0c;缺乏有效的语义标签管…

作者头像 李华
网站建设 2026/3/27 12:37:33

ResNet18实战教程:服装分类系统开发

ResNet18实战教程&#xff1a;服装分类系统开发 1. 引言 1.1 学习目标 本文将带你从零开始&#xff0c;使用 ResNet-18 模型构建一个完整的服装图像分类系统。你将掌握&#xff1a; - 如何加载并微调预训练的 ResNet-18 模型 - 构建数据管道与图像增强策略 - 训练流程设计与…

作者头像 李华
网站建设 2026/3/31 4:30:18

ResNet18应用教程:智能农业的作物监测

ResNet18应用教程&#xff1a;智能农业的作物监测 1. 引言&#xff1a;通用物体识别与ResNet-18的价值 在智能农业快速发展的今天&#xff0c;精准、高效的作物监测已成为提升农业生产效率的关键环节。传统的人工巡检方式不仅耗时耗力&#xff0c;还难以应对大规模农田的实时…

作者头像 李华
网站建设 2026/4/7 8:14:22

ResNet18应用解析:智能交通管理系统

ResNet18应用解析&#xff1a;智能交通管理系统 1. 技术背景与应用场景 随着城市化进程的加速&#xff0c;交通管理正面临前所未有的挑战。传统的监控系统依赖人工值守和规则化检测&#xff0c;难以应对复杂多变的交通场景。近年来&#xff0c;深度学习技术的突破为智能交通系…

作者头像 李华
网站建设 2026/4/16 15:04:41

整流二极管温升问题:桥式电路操作指南

整流二极管为何发烫&#xff1f;桥式整流电路的“热”真相与实战应对你有没有遇到过这样的情况&#xff1a;电源板刚做完&#xff0c;通电测试一切正常&#xff0c;可连续运行两小时后&#xff0c;整流桥突然冒烟、外壳发黑&#xff0c;甚至直接开路失效&#xff1f;如果你排查…

作者头像 李华