news 2026/2/28 19:02:35

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/2/26 7:19:13

深度剖析vivado除法器ip核在复数运算中的应用

深度拆解Vivado除法器IP核如何“撬动”复数运算&#xff1a;从数学公式到FPGA实现当复数遇上FPGA&#xff1a;一个“算不动”的现实问题在现代数字信号处理系统中&#xff0c;复数早已不是课本里的抽象符号——它是通信系统中的I/Q信号、雷达回波的相位信息、图像变换域的核心载…

作者头像 李华
网站建设 2026/2/22 17:17:36

RISC-V中断向量表配置实战案例解析

RISC-V中断向量表配置实战&#xff1a;从原理到代码的完整指南你有没有遇到过这样的情况&#xff1f;在调试一个RISC-V芯片时&#xff0c;外部中断来了却没响应&#xff0c;或者进去了中断服务函数但返回后程序“飞”了。别急&#xff0c;这很可能不是硬件出了问题——而是你的…

作者头像 李华
网站建设 2026/2/27 12:18:13

ResNet18技术揭秘:为什么它能精准识别1000类物体

ResNet18技术揭秘&#xff1a;为什么它能精准识别1000类物体 1. 引言&#xff1a;通用物体识别中的ResNet-18 在当今人工智能应用中&#xff0c;图像分类是计算机视觉最基础也最关键的一步。从智能相册自动打标签&#xff0c;到自动驾驶系统感知环境&#xff0c;背后都离不开…

作者头像 李华
网站建设 2026/2/26 15:32:31

ResNet18性能对比:CPU与GPU推理速度测试报告

ResNet18性能对比&#xff1a;CPU与GPU推理速度测试报告 1. 背景与测试目标 随着深度学习在通用物体识别领域的广泛应用&#xff0c;ResNet系列模型因其出色的精度与效率平衡&#xff0c;成为工业界和学术界的首选之一。其中&#xff0c;ResNet-18 作为轻量级代表&#xff0c…

作者头像 李华
网站建设 2026/2/25 7:40:39

ResNet18应用实例:零售货架商品识别系统

ResNet18应用实例&#xff1a;零售货架商品识别系统 1. 引言&#xff1a;通用物体识别与ResNet-18的工程价值 在智能零售、自动化巡检和视觉监控等场景中&#xff0c;快速、稳定、低成本的通用物体识别能力是实现智能化升级的关键基础。传统方案依赖云API调用或复杂部署流程&…

作者头像 李华
网站建设 2026/2/23 0:14:28

ResNet18性能优化:CPU推理速度提升5倍的详细步骤

ResNet18性能优化&#xff1a;CPU推理速度提升5倍的详细步骤 1. 背景与挑战&#xff1a;通用物体识别中的效率瓶颈 在边缘计算和本地化部署场景中&#xff0c;深度学习模型的推理效率直接决定了用户体验和系统可用性。尽管ResNet-18作为轻量级图像分类模型被广泛使用&#xf…

作者头像 李华