Я новичок в компонентах архитектуры Android и пытаюсь освободить место для хранения данных с моего сервера. Проблема в том, что данные не отображаются в представлении рециркулятора, и я думаю, что проблема заключается в вставке данных в БД, поскольку я могу извлечь данные из моего API с помощью Retrofit, а запись данных из БД показывает нулевое значение. Любое предложение высоко ценится!
Ресторан Pojo для API:
RestaurantsModel.java
Ресторан
Restaurant.java
Местоположение объекта (это @Embedded в ресторанном объекте):
Location.java
Все они используют аналогичные DataTypeConverters только своего типа / класса:
MenuTypeConverter.java
RestaurantDao.java:
@Dao
public interface RestaurantDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void saveAll(List<Restaurant> restaurants);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void save(Restaurant restaurants);
@Update
void update(Restaurant restaurants);
@Delete
void delete(Restaurant restaurants);
@Query("SELECT * FROM Restaurant")
LiveData<List<Restaurant>> findAll();
@Query("SELECT COUNT(*) FROM Restaurant")
int totalRestaurants();
}
RestaurantsDatabase.java (я также пытался добавить объекты в БД, которые все еще не отображались):
@Database(entities = {Restaurant.class}, version = 1)
public abstract class RestaurantsDatabase extends RoomDatabase {
private static RestaurantsDatabase INSTANCE;
private final static List<Restaurant> RESTAURANTS = Arrays.asList(
new Restaurant("Winterlympics", "Norway's", "He finished","`1AM",
"6AM","d", "of", 2, 2, 4,
2, 2,4,4,null,"p",null,
new Location("USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA"),
null,null,null,null,null),
new Restaurant("Winterlympics", "NOway's", "04850568540","`1AM",
"6AM","d", "of", 2, 2, 4,
2, 2,4,4,null,"p",null,
new Location("USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA"),
null,null,null,null,null)
);
public abstract RestaurantDao restaurantDao();
private static final Object sLock = new Object();
public static RestaurantsDatabase getInstance(Context context) {
synchronized (sLock) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
RestaurantsDatabase.class, "Restaurants.db")
.allowMainThreadQueries()
.addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
Executors.newSingleThreadExecutor().execute(
() -> getInstance(context).restaurantDao().saveAll(RESTAURANTS));
}
})
.build();
}
return INSTANCE;
}
}
}
RestaurantViewModel.java:
public class RestaurantViewModel extends AndroidViewModel {
private RestaurantDao restaurantDao;
private ExecutorService executorService;
private ApiInterface webService;
public RestaurantViewModel(@NonNull Application application) {
super(application);
restaurantDao = RestaurantsDatabase.getInstance(application).restaurantDao();
executorService = Executors.newSingleThreadExecutor();
webService = ApiClient.getApiClient().create(ApiInterface.class);
}
LiveData<List<Restaurant>> getAllRestaurants() {
refreshUser();
Log.d("TAG", "============ From DB: " + restaurantDao.findAll().getValue());
return restaurantDao.findAll();
}
void saveRestaurant(Restaurant restaurant) {
executorService.execute(() -> restaurantDao.save(restaurant));
}
void deleteRestaurant(Restaurant restaurant) {
executorService.execute(() -> restaurantDao.delete(restaurant));
}
private void refreshUser() {
executorService.execute(() -> {
int numOfRestaurants = restaurantDao.totalRestaurants();
// If user have to be updated
if (numOfRestaurants < 30) {
Call<RestaurantsModel> call = webService.getRestaurants("Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvb3Z0by5jb1wvYXBpXC9sb2dpbiIsImlhdCI6MTU0MjM2ODY4MiwiZXhwIjoxNTQyMzcyMjgyLCJuYmYiOjE1NDIzNjg2ODIsImp0aSI6Im1GSHM4WmNiUVN0TEdJRHMiLCJzdWIiOjEsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjcifQ.-w1bouh4ljb-kk5zsu1vfaOcIIpaHcCUps5y3KuY6bc");
call.enqueue(new Callback<RestaurantsModel>() {
@Override
public void onResponse(@NonNull Call<RestaurantsModel> call, @NonNull Response<RestaurantsModel> response) {
restaurantDao.saveAll(response.body().getData().getData());
}
@Override
public void onFailure(@NonNull Call<RestaurantsModel> call, @NonNull Throwable t) {
Log.d("TAG", "@Request onFailure " + t.toString());
}
});
}
});
}}
MainActivity:
public class MainActivity extends AppCompatActivity {
private RestaurantsAdapter restaurantsAdapter;
private RestaurantViewModel restaurantViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
restaurantsAdapter = new RestaurantsAdapter(this);
restaurantViewModel = ViewModelProviders.of(this).get(RestaurantViewModel.class);
restaurantViewModel.getAllRestaurants().observe(this, restaurants -> restaurantsAdapter.setData(restaurants));
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(restaurantsAdapter);
}
}
Адаптер:
RestaurantsAdapter
Если потребуется дополнительная информация, дайте мне знать. Спасибо, что даже прочитали мой длинный пост ...