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

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

相关推荐
2501_944525545 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 预算详情页面
android·开发语言·前端·javascript·flutter·ecmascript
清蒸鳜鱼6 小时前
【Mobile Agent——Droidrun】MacOS+Android配置、使用指南
android·macos·mobileagent
2501_915918416 小时前
HTTPS 代理失效,启用双向认证(mTLS)的 iOS 应用网络怎么抓包调试
android·网络·ios·小程序·https·uni-app·iphone
峥嵘life6 小时前
Android EDLA CTS、GTS等各项测试命令汇总
android·学习·elasticsearch
Cobboo6 小时前
i单词上架鸿蒙应用市场之路:一次从 Android 到 HarmonyOS 的完整实战
android·华为·harmonyos
天下·第二6 小时前
达梦数据库适配
android·数据库·adb
定偶6 小时前
MySQL知识点
android·数据结构·数据库·mysql
iwanghang6 小时前
Android Studio 2023.2.1 新建项目 不能选择Java 解决方法
android·ide·android studio
似霰7 小时前
JNI 编程指南10——从内存角度看引用类型
android·jni
南墙上的石头7 小时前
Android端 人工智能模型平台开发实战:模型服务部署与运维平台
android·运维