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永远不会为空。如果不查看活动代码,很难说。我建议在发布另一个问题之前尝试自己弄清楚。有关设置工作人员输入数据的此页可能会有所帮助: