我正在创建一个应用程序,我有一个在线数据库,我使用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()的入队队列来解决了这个问题。