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

相关推荐
饭小猿人3 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
_李小白3 小时前
【android opencv学习笔记】Day 8: remap(像素位置重映射)
android·opencv·学习
美狐美颜SDK开放平台3 小时前
多场景美颜SDK解决方案:直播APP(iOS/安卓)开发接入详解
android·人工智能·ios·音视频·美颜sdk·第三方美颜sdk·短视频美颜sdk
嗷o嗷o4 小时前
Android BLE 里,MTU、分包和长数据发送到底该怎么处理
android
Gary Studio5 小时前
Android AIDL HAL工程结构示例
android
y = xⁿ6 小时前
MySQL八股知识合集
android·mysql·adb
andr_gale7 小时前
04_rc文件语法规则
android·framework·aosp
祖国的好青年8 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
黄林晴8 小时前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle