Kotlin 中的 Flow with Room

问题描述

我是 kotlin android 的新手我正在尝试使用我的代码流空间

我的实体如下

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

我的数据库类如下

@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 getDataBaseInstance(context:Context):UserDatabase
         {
             var 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
             }
         }
     }
}

我的道如下

@Dao
interface UserDao {

    @Insert(onConflict = OnConflictStrategy.IGnorE)
    suspend fun addUser(user:User) :Long

    @Query("SELECT * from user_data")
    fun fetchUserData(): Flow<List<User>>

}

我的仓库如下

class UserRepository(private val userDao:UserDao) {


    suspend fun addUser(user:User){
        val rowid:Long=userDao.addUser(user)

    }


    fun readAllUserData():Flow<List<User>>
    {
        val temp=userDao.fetchUserData()
        return temp
    }
}

我的视图模型如下

class Userviewmodel(application: Context) :viewmodel() {
    private lateinit var _readAllData:mutablelivedata<List<User>>
    private  var repository: UserRepository

    private var _firstName:String="Akshay"
    val firstName:String get()=_firstName

    private var _lastName:String=""
    val lastName:String get()=_lastName

    private var _age:String = ""
    val age:String get()=_age


    val readAllData:LiveData<List<User>> get()=_readAllData

    init {
        val userDao= UserDatabase.getDataBaseInstance(application).userDao()
        repository=UserRepository(userDao)

    }

    fun setFirstName(name:String)
    {
        _firstName=name
    }


    fun setLastName(name:String)
    {
        _lastName=name
    }


    fun setAge(name:String)
    {
        _age=name
    }

    fun addUserToDB()
    {
        viewmodelScope.launch(dispatchers.IO) {
           println("Inside addUserDB")
           repository.addUser(User(0,_firstName,_lastName,_age.toInt()))
        }

    }

    fun readDataFromUserTable():LiveData<List<User>>
    {
        return repository.readAllUserData().asLiveData()
    }
}


class UserviewmodelFactory(private val context: Context):viewmodelProvider.Factory{
    override fun <T : viewmodel?> create(modelClass: Class<T>): T {
        if(modelClass.isAssignableFrom(Userviewmodel::class.java))
        {
            return Userviewmodel(context)as T
        }
        throw IllegalArgumentException("UnkNown class")
    }

我的片段如下

class ListFragment : Fragment() {
    private var binding:FragmentListBinding?=null
    private val sharedviewmodel:Userviewmodel by activityviewmodels {UserviewmodelFactory(requireContext())}
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val fragmentBinding=FragmentListBinding.inflate(inflater,container,false);
        binding=fragmentBinding
        return fragmentBinding.root
    }

    override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
        super.onViewCreated(view,savedInstanceState)
        binding?.apply {
            viewmodel=sharedviewmodel
            lifecycleOwner=viewLifecycleOwner
            listFragment=this@ListFragment
            ToastCount()
        }
    }

    private fun ToastCount() {
        var temp=sharedviewmodel.readDataFromUserTable()
        Toast.makeText(requireContext(),temp.size.toString(),Toast.LENGTH_SHORT).show()
    }
    fun addNewUser()
    {        findNavController().navigate(R.id.action_listFragment_to_addFragment)
    }
}

我可以添加数据我在我的数据库检查器中看到数据,但我无法读取数据,它总是在我的 viewmodel 中返​​回 null ...我已经添加了所有必要的依赖项,有人请教我我做错了什么?提前致谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)