Как прочитать DataBaseRoom и отобразить TextView

#sql #sqlite #android-room #android-livedata #android-viewmodel

#sql #sqlite #android-комната #android-livedata #android-viewmodel

Вопрос:

Я практикуюсь с dataBaseRoom, для них я создал кнопку, которая позволяет мне читать базу данных, я хочу ввести имя пользователя и при нажатии кнопки (чтение базы данных) отражает меня, его имя, фамилию и возраст в texview, проблема в том, что я не знаю, как это сделать.не знаю, как отобразить данные в TextView.

Действие, в котором я хочу выполнить действия

введите описание изображения здесь

//Сущность

 @Entity(tableName = "user_table")
data class User(
    @PrimaryKey(autoGenerate = true)@ColumnInfo(name = "id") val id: Int,
    val firstName: String,
    val lastName: String,
    val age: Int
)
  

// Dao

  @Dao
interface UserDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun addUser(user: User)

    @Query("SELECT * FROM user_table ORDER BY id ASC")
    fun readAllData(): LiveData<User>
    
}
  

//База данных

 @Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
    companion object {
        @Volatile
        private var INSTANCE: UserDatabase? = null

        fun getDatabase(context: Context): UserDatabase{
            val tempInstance = INSTANCE
            if(tempInstance != null){
                return tempInstance
            }
            synchronized(this){
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    UserDatabase::class.java,
                    "user_database"
                ).build()
                INSTANCE = instance
                return instance
            }
        }
    }
}
  

// Репозиторий

  class UserRepository(private val userDao: UserDao) {
    
    val readAllData: LiveData<User> = userDao.readAllData()

    suspend fun addUser(user: User){
        userDao.addUser(user)
    }

}
  

//ViewModel

   class UserViewModel(application: Application) : AndroidViewModel(application) {

    val readAllData: LiveData<User>
    private val repository: UserRepository

    init {
        val userDao = UserDatabase.getDatabase(application).userDao()
        repository = UserRepository(userDao)
        readAllData = repository.readAllData
    }

    fun addUser(user: User) {
        viewModelScope.launch(Dispatchers.IO) {
            repository.addUser(user)
        }
    }

}
  

Я хочу добавить свой texview в этот класс

   mUserViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
        mUserViewModel.readAllData.observe(viewLifecycleOwner, Observer {

            textView1.text = it.firstName
            textView2.text = it.lastName
            textView3.text = it.age.toString()


        })
  

Ответ №1:

В вашем фрагменте добавьте наблюдателя в LiveData и установите значение TextView в наблюдателе.

Смотрите документацию здесь.


Чтобы получить данные последнего добавленного пользователя в полях, вы можете использовать это (проверьте .size , правильно ли .length для вас или):

     mUserViewModel.readAllData.observe(viewLifecycleOwner, Observer { users ->
        if (users != null) {
            for (user in users) { // I'm not sure about kotlin syntax 
                if (user.firstName == enteredFirstName amp;amp;
                             user.lastName == enteredLastname) {   
                    textViewFirstName.text = user.firstName
                    textViewLastName.text = user.lastName
                    textViewAge.text = user.age.toString()
  

Комментарии:

1. Я реализовал это таким образом, но он говорит мне, что требуется: последовательность символов! Найдено: Список <Пользователь>!, Посмотрите, пожалуйста, на ListFragment.

2. ну, потому user что имеет тип List<User> .. вы должны позвонить textViewNamw.text = user.get(0).getName() .. замените 0 на позицию пользователя, которую вы хотите показать, и getName() на метод, который вы реализовали в User

3. Я реализовал этот метод, но когда я ввожу имя пользователя в editext и нажимаю кнопку поиска, пользователь, которого я разместил в базе данных, не появляется, я обновил свой код.

4. в вашем коде вы вводите имя пользователя [0], а затем фамилию другого пользователя и возраст третьего пользователя. все три строки должны иметь одинаковую ссылку на пользователя.

5. Вы проверяли у инспектора базы данных, действительно ли данные добавлены в БД?