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

相关推荐
平头哥技术团队6 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
冬木家居7 小时前
40㎡客厅变形记,小家住出大自由[特殊字符]
android·经验分享·笔记·智能家居·微信公众平台
AFinalStone7 小时前
Android 7系统无障碍服务(六)输入事件拦截与 TouchExplorer
android·无障碍服务
天空之城--7 小时前
MT管理器Android逆向工程完全指南:从入门到实战
android
Anhty9 小时前
2026九月最新变声器测评:iOS安卓双端适配,低延迟运行更稳定
android·人工智能·功能测试·ios·智能手机
渡我白衣10 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
Android-Flutter12 小时前
flutter GetX 详解
android·flutter
MyFreeIT13 小时前
Android Manual
android
hai_android14 小时前
AIDL 实现 IPC 进程间通信
android·android studio
AFinalStone16 小时前
Android 7系统无障碍服务(五)AccessibilityNodeInfo 的构建与查询
android·无障碍服务