web-dev-qa-db-ja.com

なぜこれがAndroid部屋の挿入が機能しないのですか?

私は余裕を持ってキャッシングを実装しましたが、何らかの理由でそれが台無しになり、データが挿入されないか、データが取得されませんでしたが、多くのデバッグを行いましたが、それでも手掛かりはありません...誰かがこれを手伝ってくれませんか?したがって、画像は次のとおりです。

主な活動:

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

もちろん私がコピーしなかったゲッターセッターメソッドを持つエンティティ:

@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で返されますが、実際には、挿入が失敗したり取得したりすると取得できません...デバッグを試みましたが、何も取得できませんでした。

7
sunflower20

まず、挿入が機能しているかどうかを確認します。 DAOメソッドの下で、挿入されたすべての行のリストを取得できます

DAOに以下のメソッドを追加します

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

このメソッドは、uid(primarykey)のリストを返します。

これにより、データが挿入されているかどうかを確認できます。

動作したら、getAllData()を使用してお手伝いします。

1