【问题标题】:How to read DataBaseRoom and display a textView如何读取 DataBaseRoom 并显示 textView
【发布时间】:2020-11-15 22:37:18
【问题描述】:

我正在使用 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
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)
    }

}

//视图模型

  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()


        })

【问题讨论】:

    标签: sql sqlite android-room android-livedata android-viewmodel


    【解决方案1】:

    在您的片段中,将观察者添加到 LiveData 并在观察者中设置 TextView 值。

    See the documentation here.


    要获取字段中最新添加的用户的数据,您可以使用这个(检查.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 &&
                                 user.lastName == enteredLastname) {   
                        textViewFirstName.text = user.firstName
                        textViewLastName.text = user.lastName
                        textViewAge.text = user.age.toString()
    

    【讨论】:

    • 我以这种方式实现了它,但它告诉我Required: CharSequence!找到:List !,请查看 ListFragment。
    • 好吧,因为user 的类型为List&lt;User&gt; .. 您必须调用textViewNamw.text = user.get(0).getName() .. 将0 替换为您要显示的用户的位置,并将getName() 替换为您在User 中实现的方法
    • 我已经实现了这个方法,但是当我将用户名放入editext并按下搜索按钮时,我在数据库中托管的用户没有出现,我更新了我的代码。
    • 在您的代码中输入用户[0] 的名字,然后输入另一个用户的姓氏和第三个用户的年龄。所有三行都应具有相同的用户引用。
    • 您是否与数据库检查员核对过数据是否实际添加到数据库中?
    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2016-07-10
    • 2017-12-20
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多