[已解决]使用Retrofit2响应填充会议室数据库

时间:2020-04-27 18:41:39

标签: java android sqlite retrofit android-room

我正在创建一个应用程序,我有一个在线数据库,我使用Retrofit2和PHP来处理本地数据库的请求,并且我将Room with SQLite用于该数据库。 我已经创建了实体,DAO,存储库类和数据库,现在当我使用“数据库类回调”打开应用程序时试图填充数据库。但这不起作用。

关键是我正在尝试获取Retrofit2响应,该响应将返回改造实体列表,然后尝试将其插入到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;
    }
}

那是扩展Application的InitDatabase.class,我称之为StationDatabase getInstance

public class InitDatabase extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        StationDatabase.getInstance(this);
    }
}

然后我运行该应用程序,但未填充数据库。 而且我在服务中有一个数据库操作。

非常感谢

编辑 我终于通过在调用Retrofit请求时更改了execute()的入队队列来解决了这个问题。

0 个答案:

没有答案