[Решено] Заполнить базу данных комнат, используя ответ Retrofit2 - PullRequest
0 голосов
/ 27 апреля 2020

Я создаю приложение, у меня есть онлайн-БД, и я использую 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 .

...