#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. Вы проверяли у инспектора базы данных, действительно ли данные добавлены в БД?