news 2026/7/14 21:59:43

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/7/5 7:43:23

Vulkan--概述

目录 Vulkan 的起源 绘制一个三角形需要做什么 步骤 1 - 实例与物理设备选择 步骤 2 - 逻辑设备与队列族 步骤 3 - 窗口表面与交换链 步骤 4 - 图像视图与帧缓冲 步骤 5 - 渲染通道 步骤 6 - 图形管线 步骤 7 - 命令池与命令缓冲区 步骤 8 - 主循环 总结 API 概念 …

作者头像 李华
网站建设 2026/7/2 7:47:58

ResNet18实战案例:服装品类识别系统部署

ResNet18实战案例&#xff1a;服装品类识别系统部署 1. 引言&#xff1a;通用物体识别与ResNet-18的工程价值 在计算机视觉领域&#xff0c;通用物体识别是智能系统理解现实世界的第一步。从商品分类到内容审核&#xff0c;从智能相册到AR交互&#xff0c;精准、高效的图像分…

作者头像 李华
网站建设 2026/7/4 20:42:50

PCB电镀+蚀刻工艺简介:快速理解全流程

深入理解PCB电镀蚀刻&#xff1a;从原理到实战的全流程拆解你有没有想过&#xff0c;一块小小的手机主板上&#xff0c;密密麻麻的线路是如何做到比头发丝还细却依然稳定导通的&#xff1f;这背后离不开一个关键组合工艺——电镀 蚀刻。在现代高密度PCB制造中&#xff0c;尤其…

作者头像 李华
网站建设 2026/7/1 11:29:05

ResNet18实战:构建高精度图像分类服务

ResNet18实战&#xff1a;构建高精度图像分类服务 1. 引言&#xff1a;通用物体识别中的ResNet-18价值 在计算机视觉领域&#xff0c;通用物体识别是智能系统理解现实世界的基础能力。从自动驾驶感知环境&#xff0c;到智能家居识别用户行为&#xff0c;再到内容平台自动打标…

作者头像 李华
网站建设 2026/7/1 11:29:11

CubeAxesActor 为几何体添加边框和坐标轴

一&#xff1a;主要的知识点 1、说明 本文只是教程内容的一小段&#xff0c;因博客字数限制&#xff0c;故进行拆分。主教程链接&#xff1a;vtk教程——逐行解析官网所有Python示例-CSDN博客 2、知识点纪要 本段代码主要涉及的有①vtkCubeAxesActor立方体坐标轴 二&#x…

作者头像 李华
网站建设 2026/7/8 1:21:26

多层板PCB生产流程实例分析:常见缺陷及改善措施

多层板PCB生产全流程实战解析&#xff1a;从缺陷溯源到工艺优化你有没有遇到过这样的情况&#xff1f;一块设计完美的16层服务器主板&#xff0c;在回流焊后突然出现间歇性通信故障。FA&#xff08;失效分析&#xff09;拆解发现&#xff0c;问题竟出在第8层一个不起眼的微孔—…

作者头像 李华