Java 如何访问我的房间数据库';Android中工人类的存储库?

Java 如何访问我的房间数据库';Android中工人类的存储库?,java,android,android-room,android-workmanager,Java,Android,Android Room,Android Workmanager,我在应用程序中有一个Worker类,我想从我的房间数据库中获取数据。由于我使用的是MVVM体系结构,如何使用我的Worker类中的存储库从数据库中获取数据 代码- 工人阶级 public class SendNotification extends Worker { public SendNotification(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(cont

我在应用程序中有一个
Worker
类,我想从我的房间数据库中获取数据。由于我使用的是MVVM体系结构,如何使用我的
Worker
类中的存储库从数据库中获取数据

代码-

工人阶级

public class SendNotification extends Worker {


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

    @RequiresApi(api = Build.VERSION_CODES.M)
    @NonNull
    @Override
    public Result doWork() {

        String flightnumber = getInputData().getString("flight");
        String date = getInputData().getString("date");
       

        sendNotification(flightnumber,date);

        return Result.success();

    }}
存储库

public class FlightRepository {

    private FlightDao flightDao;
    private LiveData<List<Flight>> allFlights;

    public FlightRepository(Application application) {
        FlightDatabase database = FlightDatabase.getInstance(application);
        flightDao = database.flightDao();
        allFlights = flightDao.getAllFlights();

    }

    public void insert(Flight flight) {
        new InsertFlightAsyncTask(flightDao).execute(flight);
    }

    public void update(Flight flight) {
        new UpdateFlightAsyncTask(flightDao).execute(flight);
    }

    public void delete(Flight flight) {
        new DeleteFlightAsyncTask(flightDao).execute(flight);
    }

    public void deleteAllFlights() {
        new DeleteAllFlightsAsyncTask(flightDao).execute();
    }

    public LiveData<List<Flight>> getAllFlights() {
        return allFlights;
    }

    public Flight getFlight(String flightNumber, String date){
        return flightDao.getFlight(flightNumber,date);
    }

    public boolean existsFlight(String flightNumber, String date){
        return flightDao.existsFlight(flightNumber, date);

}

公共类FlightRepository{
私人飞行道飞行道;
所有航班的私人实时数据;
公共FlightRepository(应用程序){
FlightDatabase=FlightDatabase.getInstance(应用程序);
flightDao=database.flightDao();
allFlights=flightDao.getAllFlights();
}
公共空白插入(航班){
新建InsertFlightAsyncTask(flightDao).execute(flight);
}
公共作废更新(航班){
新建UpdateFlightAsyncTask(flightDao)。执行(flight);
}
公共作废删除(航班){
新建DeleteFlightAsyncTask(flightDao).execute(flight);
}
public void deleteAllFlights(){
新建DeleteAllFlightsAsyncTask(flightDao).execute();
}
公共LiveData getAllFlights(){
返回所有航班;
}
公共航班getFlight(字符串航班号,字符串日期){
返回flightDao.getFlight(航班号、日期);
}
公共布尔existsFlight(字符串航班号、字符串日期){
返回flightDao.existsFlight(航班号、日期);
}

您应该能够在
Worker
内创建
FlightRepository
的实例:

public class SendNotification extends Worker {

  private FlightRepository flightRepo;


public SendNotification(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    super(context, workerParams);
    this.flightRepo = new FlightRepository(context)
}

@RequiresApi(api = Build.VERSION_CODES.M)
@NonNull
@Override
public Result doWork() {

    String flightnumber = getInputData().getString("flight");
    String date = getInputData().getString("date");
   
    // Do what is needed with flightRepo

    sendNotification(flightnumber,date);

    return Result.success();

}}

在这里做一些假设。我将重构
FlightDatabase
以接受
上下文,而不是
应用程序
。我不确定数据库为什么需要访问
应用程序

您应该能够在
工作者
中创建
FlightRepository
的实例:

public class SendNotification extends Worker {

  private FlightRepository flightRepo;


public SendNotification(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    super(context, workerParams);
    this.flightRepo = new FlightRepository(context)
}

@RequiresApi(api = Build.VERSION_CODES.M)
@NonNull
@Override
public Result doWork() {

    String flightnumber = getInputData().getString("flight");
    String date = getInputData().getString("date");
   
    // Do what is needed with flightRepo

    sendNotification(flightnumber,date);

    return Result.success();

}}

在这里做一些假设。我会重构
FlightDatabase
以接受
上下文
,而不是
应用程序
。我不确定为什么数据库需要访问
应用程序

你的woker类取决于你的存储库,对吗?那么,创建一个存储库实例并在你的存储库中使用它class@a_本地\u初始化存储库时,我需要传入一个应用程序参数,但是因为这里是一个类而不是一个活动,我如何实例化?啊,我明白了。也许你必须更改构造函数以利用上下文而不是活动application@a_local_nobody我在ViewModel中使用存储库,因此需要该构造或者您的woker类取决于您的存储库,对吗?那么,创建一个存储库实例并在您的应用程序中使用它class@a_local_nobody初始化存储库时,我需要传入一个应用程序参数,然而,因为这里是一个类而不是一个活动,我如何实例化?啊,我明白了。也许您必须将构造函数更改为ma使用上下文而不是application@a_local_nobody我在ViewModel中使用存储库,因此我需要构造函数,谢谢!有时即使flightnumber和date在活动中有值,在doWork()中也显示为null工作人员的方法。原因可能是什么?因为我可以肯定,flightnumber和date永远不会为空。如果没有看到活动代码,很难说。我建议在发布另一个问题之前尝试自己弄清楚这一点。这个关于为工作人员设置输入数据的页面可能会有所帮助:这很有效,谢谢!有时甚至当flightnumber和date在活动中有值,在doWork()中显示为null方法。原因可能是什么?因为我可以肯定,flightnumber和date永远不会为空。如果不查看活动代码,很难说。我建议在发布另一个问题之前尝试自己弄清楚。有关设置工作人员输入数据的此页可能会有所帮助: