简体   繁体   English

如何在 WorkManager 中获取 Room Database ViewModel 实例?

[英]How to get a Room Database ViewModel instance inside WorkManager?

I am newbie in Android development.我是 Android 开发的新手。 I am failing to get the room db viewmodel which extends AndroidViewModel inside WorkManager .我无法获得在 WorkManager 中扩展 AndroidViewModel 的房间数据库视图模型 I want to get a viewmodel class instance to do insert inside room db.我想获得一个视图模型 class 实例来插入房间数据库。

AppAdViewModel.class AppAdViewModel.class

public class AppAdViewModel extends AndroidViewModel {

    private AppAdRepository appAdRepository;

    public AppAdViewModel(@NonNull Application application) {
        super(application);
        appAdRepository = new AppAdRepository(application);
    }

    public void insert(AppAdModel appAdModel){
        appAdRepository.insertAd(appAdModel);
    }

}

MyBackgroundWorker.class MyBackgroundWorker.class

public class AppDataSyncingworker extends Worker{


    private Context context;
    private AppAdViewModel appAdViewModel;

    public AppDataSyncingworker(@NonNull Context context, @NonNull WorkerParameters workerParams){
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {

        this.context = getApplicationContext();
        // error on this line
        this.appAdViewModel = new ViewModelProvider((AppCompatActivity)context).get(AppAdViewModel.class);
        return null;
    }

The error it's showing is:它显示的错误是:

java.util.concurrent.ExecutionException: java.lang.ClassCastException: android.app.Application cannot be cast to androidx.appcompat.app.AppCompatActivity
        at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:516)
        at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
        at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:298)
        at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to androidx.appcompat.app.AppCompatActivity

Any help or guide what i am doing wrong?任何帮助或指导我做错了什么?

Calling getApplicationContext() should not be the preferred way of getting the Context.调用 getApplicationContext() 不应该是获取 Context 的首选方式。 public constructor of Worker takes a Context as the first parameter. Worker 的公共构造函数将 Context 作为第一个参数。 You can use that你可以用那个

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 房间数据库和viewmodel如何工作? - How room database and viewmodel works? 如何从 Room 数据库中获取 SQLite 数据库实例引用? - How to get the SQLite database instance reference from the Room database? 使用 WorkManager 更新 Room 中的数据库条目 - Update database entry in Room using WorkManager 在回调中创建Room数据库的实例,或使用该数据库的成员变量 - Creating an instance of Room Database inside the callback or use the member variable of that database 如何销毁Android Room Database实例? - How to destroy Android Room Database instance? 如果已经存在它的实例,如何预填充 Room 数据库? - How to prepopopulate Room database if there is already existing instance of it? 带有LiveData,存储库和ViewModel的Room Database如何一起工作? - How does the Room Database with LiveData, repository, and viewmodel work together? 如何使用存储库和ViewModel更新会议室数据库中的字段 - How do I update a field in a room database using a repository & viewmodel Android/Room/ViewModel:将 ViewModel 保存到房间数据库时出错 - Android/Room/ViewModel : Error while saving ViewModel to Room Database 如何从 Worker 获取 Output 数据? (MVVM + WorkManager + Room) - How do i get the Output Data from a Worker? (MVVM + WorkManager + Room)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM