无法创建类-ViewModel(Java)的实例

发布于 2025-01-24 14:09:21 字数 3341 浏览 4 评论 0原文

我正在尝试将Android ViewModel,Livedata与房间数据库一起使用。尽管房间数据库正在很好地工作,但是当我尝试创建一个ViewModel类的实例时,我总是会遇到的错误

无法创建一个com.ceylonlinux.apwsdelivery.viewmodel.unproductiveactivityvivitivitivityviewmodel

这些是我的视图,Entity,Entity和Dao类数据库类

数据库类别数据库类,

@Database(entities = { Reason.class}, version = 1)
public abstract class APWSDatabase extends RoomDatabase {
    public abstract UnproductiveVisitDao unproductiveVisitDao();
    public abstract ReasonDao reasonDao();
    public abstract CustomerDao customerDao();
}

我的活动类中的实体类

@Entity
public class Reason {

    @PrimaryKey
    private int reasonId;
    private int reasonType;
    private String reasonName;

    public Reason() {
    }

    public Reason(int reasonId, int reasonType, String reasonName) {
        this.reasonId = reasonId;
        this.reasonType = reasonType;
        this.reasonName = reasonName;
    }

    public int getReasonId() {
        return reasonId;
    }

    public void setReasonId(int reasonId) {
        this.reasonId = reasonId;
    }

    public int getReasonType() {
        return reasonType;
    }

    public void setReasonType(int reasonType) {
        this.reasonType = reasonType;
    }

    public String getReasonName() {
        return reasonName;
    }

    public void setReasonName(String reasonName) {
        this.reasonName = reasonName;
    }



}

dao类

public interface ReasonDao {

    @Insert
    void insertAll(Reason... reasons);

    @Insert
    void insert(Reason reason);

    @Query("SELECT * FROM reason")
    List<Reason> loadAll();



    @Query("SELECT * FROM reason where reasonType = (:reasonType)")
    List<Reason> getReasonsByType(Integer reasonType);

    @Query("SELECT * FROM reason where reasonType = (:reasonType)")
    LiveData<List<Reason>> getReasonsByTypeLive(Integer reasonType);

    @Delete
    void delete(Reason reason);


}

ViewModel类

public class UnproductiveActivityViewModel extends ViewModel {

    private LiveData<List<Reason>> unproductiveReasons;
    private Application application;
    private ReasonRepository repository;

    public UnproductiveActivityViewModel(Application application) {
        this.application = application;

        try {

            repository = new ReasonRepository(application);
            unproductiveReasons = repository.getUnproductiveReasons();
        }catch (Exception e)
        {
            Log.e("ERROR",e.toString());
        }

    }


    public LiveData<List<Reason>> getUnproductiveReasons() {

        return unproductiveReasons;
    }


}

,如下所示

 viewModel = new ViewModelProvider(UnproductiveActivity.this).get(UnproductiveActivityViewModel.class);

        viewModel.getUnproductiveReasons().observe(this, reasonsz -> {

            reasons = (ArrayList<Reason>) reasonsz;
            adapter_reason = new ArrayAdapter<Reason>(UnproductiveActivity.this, android.R.layout.simple_spinner_item, reasons);
            adapter_reason.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            un_reason_spinner.setAdapter(adapter_reason);
            un_reason_spinner.setPaddingSafe(0, 0, 0, 0);
        });

I am trying to use android viewmodel , livedata with room database. although room database is working finely , when i try to create a instance of viewmodel class i always got following error

Cannot create an instance of class com.ceylonlinux.apwsdelivery.viewmodel.UnproductiveActivityViewModel

these are my viewmodel , activity , entity and dao classes

database class

@Database(entities = { Reason.class}, version = 1)
public abstract class APWSDatabase extends RoomDatabase {
    public abstract UnproductiveVisitDao unproductiveVisitDao();
    public abstract ReasonDao reasonDao();
    public abstract CustomerDao customerDao();
}

entity class

@Entity
public class Reason {

    @PrimaryKey
    private int reasonId;
    private int reasonType;
    private String reasonName;

    public Reason() {
    }

    public Reason(int reasonId, int reasonType, String reasonName) {
        this.reasonId = reasonId;
        this.reasonType = reasonType;
        this.reasonName = reasonName;
    }

    public int getReasonId() {
        return reasonId;
    }

    public void setReasonId(int reasonId) {
        this.reasonId = reasonId;
    }

    public int getReasonType() {
        return reasonType;
    }

    public void setReasonType(int reasonType) {
        this.reasonType = reasonType;
    }

    public String getReasonName() {
        return reasonName;
    }

    public void setReasonName(String reasonName) {
        this.reasonName = reasonName;
    }



}

Dao class

public interface ReasonDao {

    @Insert
    void insertAll(Reason... reasons);

    @Insert
    void insert(Reason reason);

    @Query("SELECT * FROM reason")
    List<Reason> loadAll();



    @Query("SELECT * FROM reason where reasonType = (:reasonType)")
    List<Reason> getReasonsByType(Integer reasonType);

    @Query("SELECT * FROM reason where reasonType = (:reasonType)")
    LiveData<List<Reason>> getReasonsByTypeLive(Integer reasonType);

    @Delete
    void delete(Reason reason);


}

viewmodel class

public class UnproductiveActivityViewModel extends ViewModel {

    private LiveData<List<Reason>> unproductiveReasons;
    private Application application;
    private ReasonRepository repository;

    public UnproductiveActivityViewModel(Application application) {
        this.application = application;

        try {

            repository = new ReasonRepository(application);
            unproductiveReasons = repository.getUnproductiveReasons();
        }catch (Exception e)
        {
            Log.e("ERROR",e.toString());
        }

    }


    public LiveData<List<Reason>> getUnproductiveReasons() {

        return unproductiveReasons;
    }


}

in my activity class i used it like as follows

 viewModel = new ViewModelProvider(UnproductiveActivity.this).get(UnproductiveActivityViewModel.class);

        viewModel.getUnproductiveReasons().observe(this, reasonsz -> {

            reasons = (ArrayList<Reason>) reasonsz;
            adapter_reason = new ArrayAdapter<Reason>(UnproductiveActivity.this, android.R.layout.simple_spinner_item, reasons);
            adapter_reason.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            un_reason_spinner.setAdapter(adapter_reason);
            un_reason_spinner.setPaddingSafe(0, 0, 0, 0);
        });

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文