问题描述
我是 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 (将#修改为@)