首页 > 解决方案 > Room Database:如何一次性获取数据?

问题描述

这是我的数据库

@Database(entities = [UserModel::class], version = 1,exportSchema = false)
abstract class UserRoomDatabase : RoomDatabase() {
    abstract fun getUserDao() : UserDAO

    companion object{
        @Volatile
        private var instance : UserRoomDatabase?= null
        fun getInstance(context : Context): UserRoomDatabase{
            if(instance==null)
                instance = Room
                    .databaseBuilder(context,UserRoomDatabase::class.java,"UserRoomDatabase")
                    .allowMainThreadQueries()
                    .build()
            return instance!!
        }
    }
}

DAO接口

@Dao
interface UserDAO {
    @Query("select * from user_table where _id =:id")
    fun readUserByIdSyncDAO(id : String) : UserModel
}

存储库

class UserRepository(context : Context) {
    private val userDAO : UserDAO
    init {
        val userDatabase: UserRoomDatabase = UserRoomDatabase.getInstance(context)
        userDAO = userDatabase.getUserDao()
    }
fun readUserByIdSyncDAO(id : String) : UserModel = userDAO.readUserByIdSyncDAO(id)
}

视图模型

class UserViewModel(private val userRepository: UserRepository) : ViewModel() {
       fun readUserByIdSyncDAO(id : String) : UserModel = userRepository.readUserByIdSyncDAO(id)
}

这就是我使用的方式

 val userModel = viewModel.readUserByIdSyncDAO(userId)
        Log.e(TAG,userModel.toString())

但我得到了错误

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.ArrayList com.animals.snowy.models.UserModel.getFriends()' on a null object reference

为什么会出现此错误,我该如何解决?

我想知道我是否在数据库中使用allowMainThreadQueries(),对应用程序来说是好还是坏?

标签: androidandroid-room

解决方案


推荐阅读