Я создаю приложение, у меня есть онлайн-БД, и я использую Retrofit2 и PHP для запросов к локальной БД, и я использую Room с SQLite для этого. Я создал Entity, DAO, класс репозитория и базу данных, и теперь я пытаюсь заполнить свою БД, когда открываю приложение с помощью Callback on Database Class. Но это не работает.
Суть в том, что я пытаюсь получить ответ Retrofit2, который возвращает список объектов Retrofit, и пытаюсь вставить их в Room.
Это StationDatabase.class
@Database(entities = {StationSQLiteEntity.class}, version = 12)
public abstract class StationDatabase extends RoomDatabase {
private static StationDatabase instance;
private static RoomDatabase.Callback roomCallback = new RoomDatabase.Callback() {
@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
new LoadStationsAT(instance).execute();
}
};
public static synchronized StationDatabase getInstance(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(context.getApplicationContext(), StationDatabase.class, "station_database")
.fallbackToDestructiveMigration()
.addCallback(roomCallback)
.build();
}
return instance;
}
public abstract StationSQLiteDAO stationDAO();
private static class LoadStationsAT extends AsyncTask<Void, Void, Void> {
private final StationSQLiteDAO stationDAO;
private List<StationRetrofit> allStations;
public LoadStationsAT(StationDatabase db) {
this.stationDAO = db.stationDAO();
allStations = new ArrayList<>();
}
@Override
protected Void doInBackground(Void... voids) {
Call<ReadAllStationsResponse> readAllStations = RetrofitClient
.getInstance()
.getAPI()
.readAllStations();
readAllStations.enqueue(new retrofit2.Callback<ReadAllStationsResponse>() {
@Override
public void onResponse(Call<ReadAllStationsResponse> call, Response<ReadAllStationsResponse> response) {
ReadAllStationsResponse stationsResponse = response.body();
if (!stationsResponse.getError()) {
for(StationRetrofit s : stationsResponse.getStations()){
allStations.add(s);
StationSQLiteEntity station = new StationSQLiteEntity(Integer.parseInt(s.getStationUrlId()), s.getCity(), s.getCountry(), s.getWebSource(), s.getType(), Double.parseDouble(s.getLongitude()), Double.parseDouble(s.getLat()), 0);
station.setId(Integer.parseInt(s.getStationId()));
stationDAO.createStation(station);
}
}
}
@Override
public void onFailure(Call<ReadAllStationsResponse> call, Throwable t) {
}
});
return null;
}
}
Это класс InitDatabase.class, который расширяет приложение, и я вызываю StationDatabase getInstance
public class InitDatabase extends Application {
@Override
public void onCreate() {
super.onCreate();
StationDatabase.getInstance(this);
}
}
И затем я запускаю приложение, но БД не заполняется. А также у меня есть операция с БД в службе.
Большое спасибо
EDIT Я наконец решил ее, изменив onqueue для execute () при вызове запроса Retrofit .