I implemented caching with room but for some reason it got spoiled, either it does not insert or does not get the data, I've done lot of debugging though, but still no any clue... Can someone help with this? So, the picture is following:
MainActivity:
mArticleViewModel = ViewModelProviders.of(this).get(ArticleViewModel.class);
mArticleViewModel.getArticleList(mPageNumber).observe(this, articles
-> { /* doesn't matter */ });
ViewModel:
public class ArticleViewModel extends AndroidViewModel {
public static final String TAG = "ArticleViewModel";
private LiveData<List<Article>> articleList;
private ArticleRepository articleRepository;
public ArticleViewModel(@NonNull Application application) {
super(application);
Log.d(TAG, "ArticleViewModel");
if (articleRepository == null) {
articleRepository = new ArticleRepository(application);
}
}
public LiveData<List<Article>> getArticleList(int pageNumber) {
Log.d(TAG, "getArticleList");
articleList = articleRepository.getArticles();
return articleList;
}
}
Repository:
public class ArticleRepository {
public static final String TAG = "ArticleRepository";
public static final int PAGE_SIZE = 20;
private ArticleDao mArticleDao;
public ArticleRepository(Application application) {
ArticleRoomDatabase db =
ArticleRoomDatabase.getInstance(application);
mArticleDao = db.articleDao();
loadArticles(1);
}
public void loadArticles(int page) {
Log.d(TAG, "getArticles");
// ApiService.getService().getArticles("test", "thumbnail", page,
PAGE_SIZE).enqueue(new Callback<Example>() {
// @Override
// public void onResponse(Call<Example> call,
Response<Example> response) {
// Log.d(TAG, "onResponse");
// if (response.isSuccessful()) {
// Log.d(TAG, "isSuccessful");
// List<Article> articles =
pojoToEntity(response.body().getResponse().getResults());
// populateDb(articles);
// }
// }
//
// @Override
// public void onFailure(Call<Example> call, Throwable t) {
// Log.d(TAG, "onFailure: " + t.getStackTrace());
// }
// });
//My web service is not available currently, so I use dummy data
populateDb(DummyData.populateData());
}
public LiveData<List<Article>> getArticles() {
LiveData<List<Article>> articles = mArticleDao.getAllArticles();
return articles;
}
public void populateDb(List<Article> articles) {
Log.d(TAG, "populateDb");
Article[] articleArray = new Article[articles.size()];
for (int i = 0; i < articles.size(); i++) {
articleArray[i] = articles.get(i);
}
new insertAsyncTask(mArticleDao).execute(articleArray);
}
public List<Article> pojoToEntity(List<Result> resultList) {
List<Article> articles = new ArrayList<>();
for (Result result : resultList) {
Article article = new Article();
article.setSectionName(result.getSectionName());
article.setWebTitle(result.getWebTitle());
article.setThumbnail(result.getFields().getThumbnail());
articles.add(article);
}
return articles;
}
private static class insertAsyncTask extends AsyncTask<Article, Void, Void> {
private ArticleDao articleDao;
public insertAsyncTask(ArticleDao articleDao) {
this.articleDao = articleDao;
}
@Override
protected Void doInBackground(Article... articles) {
Log.d(TAG, "doInBackground");
articleDao.insertAll(articles);
return null;
}
}
}
Entity with getter setter methods which I didn't copy of course:
@Parcel(Parcel.Serialization.BEAN)
@Entity(tableName = "articles")
public class Article {
@NonNull
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "uid")
private int uid;
@ColumnInfo(name = "section_name")
private String sectionName;
@ColumnInfo(name = "title")
private String webTitle;
@ColumnInfo(name = "image_url")
private String thumbnail;
DAO:
@Dao
public interface ArticleDao {
@Insert
void insertAll(Article... articles);
@Query("DELETE FROM articles")
void deleteAll();
@Query("SELECT * FROM articles")
LiveData<List<Article>> getAllArticles();
}
RoomDatabase:
@Database(entities = {Article.class}, version = 1, exportSchema = false)
public abstract class ArticleRoomDatabase extends RoomDatabase {
public static String TAG = "ArticleRoomDatabase";
private static ArticleRoomDatabase INSTANCE;
public static ArticleRoomDatabase getInstance(final Context context) {
if (INSTANCE == null) {
synchronized (ArticleRoomDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
ArticleRoomDatabase.class, "photo_database")
.build();
}
}
}
return INSTANCE;
}
public abstract ArticleDao articleDao();
}
As far as Logging shows, getting articles from DB fails, the list is returned null, however, in real I can't get if inserting fails or getting... tried to debug but could not get anything.
new MyAsyncTask().execute();
tonew MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
. That piece of code solved my problem. – Mcmillon