如何从 Android 中的工作人员 class 访问我的 Rooms 数据库的存储库?
How can I access my Rooms database's Repository from a Worker class in Android?
我在我的应用程序中有一个 Worker
class,我想从我的房间数据库中获取数据。由于我使用的是 MVVM 架构,我如何使用 Worker
class 中的存储库从数据库中获取数据?
代码-
工人class
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);
}
您应该能够在 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
以接受 Context
,而不是 Application
。我不确定为什么数据库需要访问 Application
我在我的应用程序中有一个 Worker
class,我想从我的房间数据库中获取数据。由于我使用的是 MVVM 架构,我如何使用 Worker
class 中的存储库从数据库中获取数据?
代码-
工人class
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);
}
您应该能够在 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
以接受 Context
,而不是 Application
。我不确定为什么数据库需要访问 Application