質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.20%

DAO・DTOのコードを書き換えたので運用させたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,409

Haru_T

score 34

DBを使って英単語のアプリを作っています。
こちらのサイトを参考にさせて頂き、DAO・DTOのコードを変更しました。
http://it-trick-java.appspot.com/android/c2019/page25058.html

このままで運用したところ、エラーが発生しました。
Activityの上に置いているFragmentをスワイプさせるためにViewPagerを置いているのですが、それがセットしているPagerAdapter上でlist(英単語の)のItem(単語や意味などのパーツ)がgetできていないようなんです。
Listの型はすべて合わせているので、理由がいまいち分かりません。
daoをActivityで使う場合のコードについて、今一度調べてみようと思います。
そしてコードをたくさん載せましたが、なにかおかしな点に気づいた方等おられましたらアドバイスお願いします。

public class WordDataDao {
    //データベースより値を取り出す

    private static final String TABLE_NAME = "WordData";
    private static final String COLUMN_DATA = "data";

    private DataBaseHelper dbhelper;
    private SQLiteDatabase db;

    public WordDataDao(SQLiteDatabase db) {
        this.db = db;
    }

    /* 全データの取得 */
    public ArrayList<WordDataDto> wordList() {
        ArrayList<WordDataDto> data = new ArrayList<>();

        String query = "SELECT * " + "FROM WordData";
        Log.d("query", "query = " + query);

        Cursor cursor = db.rawQuery(query, null);
        cursor.moveToFirst();
        while ( cursor.moveToNext()) {
            WordDataDto word = new WordDataDto();

            word.setWord(cursor.getString(0));
            word.setPron1(cursor.getString(1));
            word.setPron2(cursor.getString(2));
            word.setMean1(cursor.getString(3));
            word.setMean2(cursor.getString(4));
            word.setDescription(cursor.getString(5));
            word.setPart(cursor.getString(6));
            word.setGrade(cursor.getInt(7));

            data.add(word);
        }

        cursor.close();
        db.close();

        return data;
    }

    /* データの登録 */
    public long insert(String value) {
        ContentValues values = new ContentValues();
        values.put(COLUMN_DATA, value);
        return db.insert(TABLE_NAME, null, values);
    }
}
public class WordDataDto {
    //データベースより取り出した値を保持

    private String word;
    private String pron1;
    private String pron2;
    private String mean1;
    private String mean2;
    private String description;
    private String part;
    private int grade;

    public void setWord(String word) { this.word = word; }

    public String getWord() {return word;}


    public void setPron1(String pron1) { this.pron1 = pron1; }

    public String getPron1() {return pron1; }


    public void setPron2(String pron2) { this.pron2 = pron2; }

    public String getPron2() {return pron2;}


    public void setMean1(String mean1) { this.mean1 = mean1; }

    public String getMean1() {return mean1;}


    public void setMean2(String mean2) { this.mean2 = mean2; }

    public String getMean2() {return mean2;}


    public void setDescription(String description) { this.description = description; }

    public String getDescription() {return description;}


    public void setPart(String part) { this.part = part; }

    public String getPart() {return part;}


    public void setGrade(int grade) { this.grade = grade; }

    public int getGrade() { return grade; }

    @Override
    public String toString() {
        return "WordDto [word=" + word + ",pron1=" + pron1 + ",pron2=" + pron2 + ",mean1=" + mean1
                + ",mean2=" + mean2 + ",description=" + description + ",part="+ part + ",grade=" + grade + "]";
    }
}
public class SubActivity extends FragmentActivity {
    /*Fragmentを用意し、単語帳を表示するActivity*/

    private DataBaseHelper dbhelper;
    private WordDataDao worddao;

    private ViewPager mViewPager;
    private List<WordDataDto> wList;

   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // レイアウトをつくる
        setContentView(R.layout.activity_sub);
        mViewPager = (ViewPager) findViewById(R.id.view_pager);

        // PagerAdapter をつくる
        FragmentManager fm = getSupportFragmentManager();
        PagerAdapter adapter = new PagerAdapter(fm);

        dbhelper = new DataBaseHelper(this);
        SQLiteDatabase db = dbhelper.getReadableDatabase();
        worddao = new WordDataDao(db);

        List<WordDataDto> worddata = worddao.wordList();
        Collections.shuffle(worddata);
        db.close();

        wList = worddata;
        adapter.addAll(wList);
        adapter.notifyDataSetChanged();

        // ViewPager にセットする
        mViewPager.setAdapter(adapter);

    }

    /* 表示データの更新 */

    private void changeData() {
        List<WordDataDto> worddata = worddao.wordList();

        Collections.shuffle(worddata);
    }
public class PagerAdapter extends FragmentStatePagerAdapter {
  /*ViewPagerを使うためのAdapter*/
    private List<WordDataDto> mList;

    public PagerAdapter(FragmentManager fm){
        super(fm);
        mList = new ArrayList<>();
    }

    @Override
    public Fragment getItem(int position){

        // 対象ページの単語情報を取得
        List<WordDataDao> item = (List<WordDataDao>) mList.get(position); 👈getItemができていないらしい

        // 確認用
        Log.d("getItem", String.valueOf(position) +"ページ目は" + item.get(0));

        // 色情報を Bundle にする
        Bundle bundle = new Bundle();
        bundle.putInt("page", position);
        bundle.putString("word", String.valueOf(item.get(0)));
        bundle.putString("pron1", String.valueOf(item.get(1)));
        bundle.putString("pron2", String.valueOf(item.get(2)));
        bundle.putString("mean1", String.valueOf(item.get(3)));
        bundle.putString("mean2", String.valueOf(item.get(4)));
        bundle.putString("des", String.valueOf(item.get(5)));
        bundle.putString("part", String.valueOf(item.get(6)));

        wordFragment frag = new wordFragment();
        frag.setArguments(bundle);
        return frag;
    }

    @Override
    public int getCount(){
        return mList.size();
    }

    public void add(WordDataDto item) {
        mList.add(item);
    }


    public void addAll(List<WordDataDto> data){
        mList.clear();
        mList.addAll(data);
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yona

    2016/11/15 14:46

    エラーが発生しましたではなく、エラーの内容を具体的に書いてください。

    キャンセル

回答 1

checkベストアンサー

0

なぜ、DTOをDAOにキャストしているのでしょう。
また、mList.getが返すのはWordDataDtoであり、List<WordDataDto>ではありません。

落ち着いてコードを読み返してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/15 15:18 編集

    DTOをEnitityとごっちゃにしてしまっているかもしれません。
    でもたしかにList<WordDataDto>がmList.getを返さないのは何となくわかりますが
    DTOをActivity上でどのように扱えばいいのかが分からなくなってきました。

    引き続き調べてみることにします、、

    キャンセル

  • 2016/11/15 16:39

    ちゃんとエラーログを読んでいますか?エラーログを記載してください。

    キャンセル

  • 2016/11/15 17:20 編集

    コードが赤線だらけだったので載せているコードとはまた少し変えました。
    DAOでDBから取り出してきたデータをArrayList<WordDataDto>の型でListにするというようなサイトをいくつか見つけたのでそのようにしているんですが、
    Activity上ではそのリストをArryList<String>型に無理やり変更しようとしてしまい、
    Error:(51, 54) エラー: 不適合な型: ArrayList<WordDataDto>をArrayList<String>に変換できません:(DAOで作ったListをSubActivity上でList化しようとするとき)
    Error:(56, 24) エラー: 不適合な型: ArrayList<String>をArrayList<SparseArrayCompat<String>>に変換できません:(PagerAdapterに上記のListを加えようとするとき)
    といったようなエラーになります。
    DAOの時点でList化しない方がよいのでしょうか。

    キャンセル

  • 2016/11/15 18:47

    質問のコードとあなたがエラーが出ると言っているコードが異なるなら何を話しても無駄です。質問のコードを最新にしてください。

    ただ、DAOを使いデータを取得するときはリストで取得するのが一般的です。あなたの使い方が誤っているだけですよ。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる