如何在BroadcastReceiver类中访问Roomdatabase的数据。

问题描述 投票:0回答:1

我需要在一个BroadCastReceiver类中访问Room数据库中的数据,但正如你所知,我们需要一个生命周期所有者来获取ViewModel类的实例,如下所示。

public class AlertReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationHelper.sendFinanceLoggingNotification(context);
        RecurrenceInfoViewModel recurrenceInfoViewModel = new ViewModelProvider(this).get(RecurrenceInfoViewModel.class);

    }
}

当传递 "this "作为生命周期所有者时,android studio正在抛出错误。有谁能指导我从哪里可以得到一个BroadCastReceiver内部的生命周期所有者,或者如果你能建议任何其他方式访问数据。以下是我的ViewModel和Repository类。

    public class RecurrenceInfoViewModel extends AndroidViewModel {


    private LiveData<List<RecurrenceInfoEntity>> allRecurrenceInfos;
    private RecurrenceInfoRepository recurrenceInfoRepository;

    public RecurrenceInfoViewModel(@NonNull Application application) {
        super(application);
        recurrenceInfoRepository=new RecurrenceInfoRepository(application);


    }

    public void insertRecurrenceInfo(RecurrenceInfoEntity recurrenceInfoEntity) {
        recurrenceInfoRepository.insertRecurrenceInfo(recurrenceInfoEntity);
    }

    public void updateRecurrenceInfo(RecurrenceInfoEntity recurrenceInfoEntity) {

        recurrenceInfoRepository.updateRecurrenceInfo(recurrenceInfoEntity);
    }

    public void deleteRecurrenceInfo(RecurrenceInfoEntity recurrenceInfoEntity) {
        recurrenceInfoRepository.deleteRecurrenceInfo(recurrenceInfoEntity);
    }

    public void deleteAllRecurrenceInfos() {
        recurrenceInfoRepository.deleteAllRecurrenceInfo();
    }



    public LiveData<RecurrenceInfoEntity> getAllRecurrenceInfos(String recurrenceInfoKey) {
        return recurrenceInfoRepository.getRecurrenceInfoEntityList(recurrenceInfoKey);
    }
}





public class RecurrenceInfoRepository {


    private RecurrenceInfoDao recurrenceInfoEntityDao;
    private LiveData<List<RecurrenceInfoEntity>> recurrenceInfoEntityList;

    public RecurrenceInfoRepository(Context context) {

        MoneyManagerDatabase moneyManagerDatabase = MoneyManagerDatabase.getInstance(context);
        recurrenceInfoEntityDao = moneyManagerDatabase.getRecurrenceInfoDao();
        recurrenceInfoEntityList = recurrenceInfoEntityDao.getAllRecurrenceInfo();


    }

    public void insertRecurrenceInfo(RecurrenceInfoEntity data) {

        new PerformSingleColumnDataOperations(recurrenceInfoEntityDao,
                Constants.INSERT_SINGLE_NODE_DATABASE_OPERATION).execute(data);
    }

    public void updateRecurrenceInfo(RecurrenceInfoEntity data) {
        new PerformSingleColumnDataOperations(recurrenceInfoEntityDao,
                Constants.UPDATE_SINGLE_NODE_DATABASE_OPERATION).execute(data);
    }

    public void deleteRecurrenceInfo(RecurrenceInfoEntity data) {
        new PerformSingleColumnDataOperations(recurrenceInfoEntityDao,
                Constants.DELETE_SINGLE_NODE_DATABASE_OPERATION).execute(data);
    }

    public void deleteRecurrenceInfo(String  type) {
        new PerformSingleColumnDataOperations(recurrenceInfoEntityDao,
                Constants.DELETE_SINGLE_NODE_DATABASE_OPERATION).execute();
    }

    public void deleteAllRecurrenceInfo() {
        new PerformSingleColumnDataOperations(recurrenceInfoEntityDao,
                Constants.DELETE_ALL_NODES_DATABASE_OPERATION).execute();
    }

    public LiveData<RecurrenceInfoEntity> getRecurrenceInfoEntityList(String key) {
        return recurrenceInfoEntityDao.getAllRecurrenceInfo(key);
    }


    private static class PerformSingleColumnDataOperations extends AsyncTask<RecurrenceInfoEntity, Void, Void> {

        private RecurrenceInfoDao dataDao;
        private String operationType;


        PerformSingleColumnDataOperations(RecurrenceInfoDao dataDao, String operationType) {
            this.dataDao = dataDao;
            this.operationType = operationType;

        }

        @Override
        protected Void doInBackground(RecurrenceInfoEntity... recurrenceInfoEntities) {
            switch (operationType) {
                case Constants.INSERT_SINGLE_NODE_DATABASE_OPERATION:
                    dataDao.insertRecurrenceInfo(recurrenceInfoEntities[0]);
                    break;
                case Constants.UPDATE_SINGLE_NODE_DATABASE_OPERATION:
                    dataDao.updateRecurrenceInfo(recurrenceInfoEntities[0]);
                    break;
                case Constants.DELETE_SINGLE_NODE_DATABASE_OPERATION:
                    dataDao.deleteRecurrenceInfo(recurrenceInfoEntities[0]);
                    break;
                case Constants.DELETE_ALL_NODES_DATABASE_OPERATION:
                    dataDao.deleteAllRecurrenceInfo();
            }

            return null;
        }
    }




}

先谢谢你了,我需要在一个BroadCastReceiver类里面访问我的Room数据库的数据,但是你知道我们需要一个生命周期的所有者来获得ViewModel类的实例,如下图所示。

android broadcastreceiver android-room android-livedata
1个回答
0
投票

我已经解决了上面的问题,不使用LiveData.你可以从任何地方访问Room的数据,只需提供ApplicationContext,如下所示。

DAO:

@Query("SELECT * FROM reference_info where recurrenceInfoPrimaryKey=:recurrenceinfoprimkey")
    RecurrenceInfoEntity getAllRecurrenceInfoWithOutLiveData(String recurrenceinfoprimkey);

Repository:

  public RecurrenceInfoEntity getRecurrenceInfoEntityWithOutLiveData(String key) {
        return recurrenceInfoEntityDao.getAllRecurrenceInfoWithOutLiveData(key);
    }

BroadCastReceiver。

    public class AlertReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
new Thread(() -> {          
      RecurrenceInfoEntity recurrenceInfoEntity = 
     recurrenceInfoRepository.getRecurrenceInfoEntityWithOutLiveData(Constants.LOG_FINANCES_RECURRENCE_KEY);

         }).start();
        }
© www.soinside.com 2019 - 2024. All rights reserved.