如何修复此错误以获取视图模型? (在模拟器上运行程序时发生)
模拟器上运行程序的错误:
2022-06-16 15:38:04.724 12519-12555/com.example.mvvm e/awareLog: AtomicFileutils:不存在ReadFilelines文件: android.util.atomicfile@5ABC123 2022-06-16 15:38:04.725 12519-12555/com.example.mvvm e/awareLog: AtomicFileutils:不存在ReadFilelines文件: android.util.atomicfile@30c1620 com.example.mvvm e/androidruntime:
FATAL EXCEPTION: main
Process: com.example.mvvm, PID: 12519
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mvvm/com.example.mvvm.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:201)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:319)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:301)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at com.example.mvvm.MainActivity.onCreate(MainActivity.kt:15)
at android.app.Activity.performCreate(Activity.java:8086)
at android.app.Activity.performCreate(Activity.java:8074)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1313)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.InstantiationException: java.lang.Class<com.example.mvvm.UserViewModel> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:199)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:319)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:301)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at com.example.mvvm.MainActivity.onCreate(MainActivity.kt:15)
at android.app.Activity.performCreate(Activity.java:8086)
at android.app.Activity.performCreate(Activity.java:8074)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1313)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
2022-06-16 15:41:00.974 12826-12826/? E/om.example.mvv: Unknown bits
set in runtime_flags: 0x8000
2022-06-16 15:41:00.998 12826-12826/? E/libc: Access denied finding
property "runtime.mmitest.isrunning"
2022-06-16 15:41:01.342 12826-12897/com.example.mvvm E/AwareLog:
AtomicFileUtils: readFileLines file not exist:
android.util.AtomicFile@5abc123
2022-06-16 15:41:01.343 12826-12897/com.example.mvvm E/AwareLog:
AtomicFileUtils: readFileLines file not exist:
android.util.AtomicFile@30c1620
2022-06-16 15:41:01.768 12826-12826/com.example.mvvm
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mvvm, PID: 12826
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mvvm/com.example.mvvm.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:201)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:319)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:301)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at com.example.mvvm.MainActivity.onCreate(MainActivity.kt:15)
at android.app.Activity.performCreate(Activity.java:8086)
at android.app.Activity.performCreate(Activity.java:8074)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1313)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.InstantiationException: java.lang.Class<com.example.mvvm.UserViewModel> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:199)
mainActive:
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.mvvm.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
lateinit var binding : ActivityMainBinding
lateinit var userviewModel: UserViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this ,R.layout.activity_main)
userviewModel= ViewModelProvider(this).get(UserViewModel :: class.java)
val dao = UserDatabase.getInstance(application).userDao
val repository = UserRepository(dao)
val factory = UserViewModelFactory(repository)
userviewModel = ViewModelProvider(this ,factory).get(UserViewModel::class.java)
binding.myViewModel=userviewModel
binding.lifecycleOwner=this
}
}
userviewModel
import androidx.databinding.Bindable
import androidx.databinding.Observable
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class UserViewModel(val repository : UserRepository): ViewModel(), Observable {
val users = repository.users
@Bindable
var inputName = MutableLiveData<String>()!!
@Bindable
var inputEmail = MutableLiveData<String>()!!
@Bindable
var saveupdateButtonText = MutableLiveData<String>()
@Bindable
var deleteAlldeleteButtonText = MutableLiveData<String>()
init {
saveupdateButtonText.value = "دخیره"
deleteAlldeleteButtonText.value = "حذف"
}
fun saveOrUpdate() {
val name: String = inputName.value!!
val email: String = inputEmail.value!!
insert(User(0, name, email))
inputName.value = null
inputEmail.value = null
}
fun deleteAllOrDelete() {
deleteAll()
}
fun insert(user: User) {
viewModelScope.launch {
repository.insert(user)
}
}
fun deleteAll() {
viewModelScope.launch {
repository.deleteAll()
}
}
override fun addOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
}
override fun removeOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
}
}
:
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
class UserViewModelFactory(val repository: UserRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(UserViewModel::class.java)){
return UserViewModel(repository) as T
}
throw IllegalAccessException("Unknown ViewModel Class")
}
}
userviewmodel
class UserRepository(val dao:UserDao) {
val users = dao.getAllUsers()
suspend fun insert (user:User){
dao.insertUser(user)
}
suspend fun update (user:User){
dao.updateUser(user)
}
suspend fun delete (user:User){
dao.deleteUser(user)
}
suspend fun deleteAll (){
dao.deleteAll()
}
12519-12519 /
2022-06-16 15:38: 05.103
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName ="user_table")
data class User (
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name ="user_id")
val id :Int ,
@ColumnInfo(name="user_name")
val name :String,
@ColumnInfo(name="user_email")
val email : String
)
:
import androidx.lifecycle.LiveData
import androidx.room.*
@Dao
interface UserDao {
@Insert
public fun insertUser (user:User)
@Update
public fun updateUser (user:User)
@Delete
public fun deleteUser (user:User)
@Query("DELETE FROM user_table")
public fun deleteAll()
@Query("SELECT * FROM user_table")
fun getAllUsers(): LiveData<List<User>>
}
Error running program on emulator:
2022-06-16 15:38:04.724 12519-12555/com.example.mvvm E/AwareLog:
AtomicFileUtils: readFileLines file not exist:
android.util.AtomicFile@5abc123
2022-06-16 15:38:04.725 12519-12555/com.example.mvvm E/AwareLog:
AtomicFileUtils: readFileLines file not exist:
android.util.AtomicFile@30c1620
2022-06-16 15:38:05.103 12519-12519/com.example.mvvm E/AndroidRuntime:
FATAL EXCEPTION: main
Process: com.example.mvvm, PID: 12519
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mvvm/com.example.mvvm.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:201)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:319)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:301)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at com.example.mvvm.MainActivity.onCreate(MainActivity.kt:15)
at android.app.Activity.performCreate(Activity.java:8086)
at android.app.Activity.performCreate(Activity.java:8074)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1313)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.InstantiationException: java.lang.Class<com.example.mvvm.UserViewModel> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:199)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:319)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:301)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at com.example.mvvm.MainActivity.onCreate(MainActivity.kt:15)
at android.app.Activity.performCreate(Activity.java:8086)
at android.app.Activity.performCreate(Activity.java:8074)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1313)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
2022-06-16 15:41:00.974 12826-12826/? E/om.example.mvv: Unknown bits
set in runtime_flags: 0x8000
2022-06-16 15:41:00.998 12826-12826/? E/libc: Access denied finding
property "runtime.mmitest.isrunning"
2022-06-16 15:41:01.342 12826-12897/com.example.mvvm E/AwareLog:
AtomicFileUtils: readFileLines file not exist:
android.util.AtomicFile@5abc123
2022-06-16 15:41:01.343 12826-12897/com.example.mvvm E/AwareLog:
AtomicFileUtils: readFileLines file not exist:
android.util.AtomicFile@30c1620
2022-06-16 15:41:01.768 12826-12826/com.example.mvvm
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mvvm, PID: 12826
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mvvm/com.example.mvvm.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.mvvm.UserViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:201)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:319)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:301)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at com.example.mvvm.MainActivity.onCreate(MainActivity.kt:15)
at android.app.Activity.performCreate(Activity.java:8086)
at android.app.Activity.performCreate(Activity.java:8074)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1313)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.InstantiationException: java.lang.Class<com.example.mvvm.UserViewModel> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:199)
MainActivity:
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.mvvm.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
lateinit var binding : ActivityMainBinding
lateinit var userviewModel: UserViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this ,R.layout.activity_main)
userviewModel= ViewModelProvider(this).get(UserViewModel :: class.java)
val dao = UserDatabase.getInstance(application).userDao
val repository = UserRepository(dao)
val factory = UserViewModelFactory(repository)
userviewModel = ViewModelProvider(this ,factory).get(UserViewModel::class.java)
binding.myViewModel=userviewModel
binding.lifecycleOwner=this
}
}
userViewModel:
import androidx.databinding.Bindable
import androidx.databinding.Observable
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class UserViewModel(val repository : UserRepository): ViewModel(), Observable {
val users = repository.users
@Bindable
var inputName = MutableLiveData<String>()!!
@Bindable
var inputEmail = MutableLiveData<String>()!!
@Bindable
var saveupdateButtonText = MutableLiveData<String>()
@Bindable
var deleteAlldeleteButtonText = MutableLiveData<String>()
init {
saveupdateButtonText.value = "دخیره"
deleteAlldeleteButtonText.value = "حذف"
}
fun saveOrUpdate() {
val name: String = inputName.value!!
val email: String = inputEmail.value!!
insert(User(0, name, email))
inputName.value = null
inputEmail.value = null
}
fun deleteAllOrDelete() {
deleteAll()
}
fun insert(user: User) {
viewModelScope.launch {
repository.insert(user)
}
}
fun deleteAll() {
viewModelScope.launch {
repository.deleteAll()
}
}
override fun addOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
}
override fun removeOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
}
}
UserViewModelFactory:
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
class UserViewModelFactory(val repository: UserRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(UserViewModel::class.java)){
return UserViewModel(repository) as T
}
throw IllegalAccessException("Unknown ViewModel Class")
}
}
UserRepository:
class UserRepository(val dao:UserDao) {
val users = dao.getAllUsers()
suspend fun insert (user:User){
dao.insertUser(user)
}
suspend fun update (user:User){
dao.updateUser(user)
}
suspend fun delete (user:User){
dao.deleteUser(user)
}
suspend fun deleteAll (){
dao.deleteAll()
}
}
User:
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName ="user_table")
data class User (
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name ="user_id")
val id :Int ,
@ColumnInfo(name="user_name")
val name :String,
@ColumnInfo(name="user_email")
val email : String
)
User dao:
import androidx.lifecycle.LiveData
import androidx.room.*
@Dao
interface UserDao {
@Insert
public fun insertUser (user:User)
@Update
public fun updateUser (user:User)
@Delete
public fun deleteUser (user:User)
@Query("DELETE FROM user_table")
public fun deleteAll()
@Query("SELECT * FROM user_table")
fun getAllUsers(): LiveData<List<User>>
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
要拥有视图模型的实例,您必须这样做:
我建议您使用AndroidViewModel,
您也可以查看
android开发人员网站
To have an instance of your view model you have to do it like this:
And I recommend you to use AndroidViewModel
You can also have a look to the
android developer website