为什么此Android Room插件不起作用?

时间:2018-06-25 17:36:06

标签: android kotlin android-room android-livedata

我实现了具有空间的缓存,但是由于某种原因,它被破坏了,要么不插入,要么不获取数据,尽管我已经进行了很多调试,但是仍然没有任何线索...有人可以帮忙吗?因此,图片如下:

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;
    }
}

存储库:

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;
        }
    }
}

带有getter setter方法的实体,我当然没有复制它:

@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();
}

就Logging而言,从DB获取文章失败,该列表返回null,但是,实际上,插入失败或获取...试图调试却什么也没得到,我无法获取。

2 个答案:

答案 0 :(得分:0)

使用执行程序,AsyncTask对Room不利。

答案 1 :(得分:-1)

首先验证插入是否正常工作。您可以通过以下DAO方法获取所有插入行的列表

在您的DAO中添加以下方法

@Insert
fun insertAll(articleList : List<Article>) : List<Long>

此方法将返回uid(主键)列表。

这样,您可以验证是否插入了数据。

一旦工作,请告诉我,我将通过getAllData()帮助您