为什么此Android Room插件不起作用? [英] Why this Android Room insert does not work?

查看:86
本文介绍了为什么此Android Room插件不起作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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:

MainActivity:

mArticleViewModel = ViewModelProviders.of(this).get(ArticleViewModel.class);
mArticleViewModel.getArticleList(mPageNumber).observe(this, articles 
-> { /* doesn't matter */ });

ViewModel:

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方法的实体,我当然没有复制它:

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:

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而言,从数据库获取文章失败,该列表返回null,但是,实际上,插入失败或获取...尝试调试却什么也没得到,我无法获取.

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.

推荐答案

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

First verify that insert is working or not. You can get list of all inserted row by below DAO method

在您的DAO中添加以下方法

Add below method in your DAO

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

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

this method will return list of uid (primarykey).

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

That way you can verify data are inserted or not.

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

Once it is working let me know i will help you out with getAllData()

这篇关于为什么此Android Room插件不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆