要实现Android双向数据绑定与Room表模型的解决方法,可以按照以下步骤进行:
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0'
implementation 'androidx.room:room-runtime:2.2.6'
implementation 'androidx.room:room-ktx:2.2.6'
kapt 'androidx.room:room-compiler:2.2.6'
@Entity(tableName = "user")
data class User(
@PrimaryKey val id: Int,
val name: String,
val age: Int
)
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
private var INSTANCE: AppDatabase? = null
fun getInstance(context: Context): AppDatabase {
if (INSTANCE == null) {
synchronized(AppDatabase::class) {
INSTANCE = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database"
).build()
}
}
return INSTANCE as AppDatabase
}
}
}
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAllUsers(): LiveData>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertUser(user: User)
@Delete
suspend fun deleteUser(user: User)
}
class UserViewModel(application: Application) : AndroidViewModel(application) {
private val userDao: UserDao = AppDatabase.getInstance(application).userDao()
val allUsers: LiveData> = userDao.getAllUsers()
fun addUser(user: User) {
viewModelScope.launch(Dispatchers.IO) {
userDao.insertUser(user)
}
}
fun deleteUser(user: User) {
viewModelScope.launch(Dispatchers.IO) {
userDao.deleteUser(user)
}
}
}
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var userViewModel: UserViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
binding.viewModel = userViewModel
binding.lifecycleOwner = this
}
}
通过以上步骤,就可以实现Android双向数据绑定与Room表模型。在布局文件中,当用户输入姓名和年龄时,会自动更新ViewModel中的数据,并且点击按钮时会将数据插入到数据库中。同时,ViewModel中的数据发生变化时,布局文件中的EditText也会自动更新。