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

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

ただいまの
回答率

90.37%

  • Android Studio

    4435questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • SQL

    3154questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • データベース

    882questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

  • SQLite

    817questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

android studio データベースからデータを取り出す方法について

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 822

hanamero50

score 6

 前提・実現したいこと

android studioでクイズゲームを作っています。
データベースに登録した問題を問題画面にてランダムに表示させ、回答ボタンを押した後解説画面に遷移するところまではできたのですが、その後の処理で行き詰っています。

具体的に言うと、解説画面で前に表示していた問題に対応した、データベースに登録した解説を表示させたいのですが、どのように記述すればいいかわからないので教えていただきたいです。
よろしくお願いします。

 該当のソースコード

**MainGame,java 問題表示画面**
public class MainGame extends Activity {

    String QuestionNo;
    String Seikai;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //タイトルバーを非表示にする(必ずsetContentViewの前にすること)
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // レイアウトをセットする
        setContentView(R.layout.activity_main_game);

    }

    @Override
    protected void onResume() {
        super.onResume();




        // 問題文セット処理呼び出し
        setQuestion();

    }

    // 問題文セット処理
    private void setQuestion(){
        // 作成したDatabaseHelperクラスに読み取り専用でアクセス
        DatabaseHelper dbHelper = new DatabaseHelper(this);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        /*
        SELECT文
        テーブル名 MyTableから _idとQuestionNoがマッチする項目を取得する条件式
         */
        String sql = "SELECT Pref, City0, City1, City2, City3, City4 FROM MyTable  ORDER BY RANDOM()";

        // SQL文を実行してカーソルを取得
        Cursor c = db.rawQuery(sql, null);
        c.moveToFirst();

        // データベースから取ってきたデータを変数にセット
        String Kenmei = c.getString(c.getColumnIndex("Pref"));
        String Choice1 = c.getString(c.getColumnIndex("City1")); // 四択の選択肢1
        String Choice2 = c.getString(c.getColumnIndex("City2")); // 四択の選択肢2
        String Choice3 = c.getString(c.getColumnIndex("City3")); // 四択の選択肢3
        String Choice4 = c.getString(c.getColumnIndex("City4")); // 四択の選択肢4

        Seikai = c.getString(c.getColumnIndex("City0")); // 答え

        // データベースのクローズ処理
        c.close();
        db.close();

        ((TextView)findViewById(R.id.textQuestion)).setText(Kenmei);
        ((Button)findViewById(R.id.button1)).setText(Choice1); // 四択の選択肢1をボタンに表示
        ((Button)findViewById(R.id.button2)).setText(Choice2); // 四択の選択肢2をボタンに表示
        ((Button)findViewById(R.id.button3)).setText(Choice3); // 四択の選択肢3をボタンに表示
        ((Button)findViewById(R.id.button4)).setText(Choice4); // 四択の選択肢4をボタンに表示

    }

        // 選択肢がクリックされた時の処理
        public void onClick(View v) {

            Intent intent;
            switch (v.getId()) {
                case R.id.button1:
                    intent = new Intent(MainGame.this, kaitou.class);
                    // 遷移開始
                    startActivity(intent);
                    break;

                case R.id.button2:
                    intent = new Intent(MainGame.this, kaitou.class);
                    // 遷移開始
                    startActivity(intent);
                    break;

                case R.id.button3:
                    intent = new Intent(MainGame.this, kaitou.class);
                    // 遷移開始
                    startActivity(intent);
                    break;

                case R.id.button4:
                    intent = new Intent(MainGame.this, kaitou.class);
                    // 遷移開始
                    startActivity(intent);
                    break;
            }
        }
**データベース**
public class DatabaseHelper extends SQLiteOpenHelper {

    public DatabaseHelper(Context context) {

        /*
            ここで任意のデータベースファイル名と、バージョンを指定する
            データベースファイル名 = MyTable.db
            バージョン = 1
         */
        super(context, "MyTable.db", null, 1);
    }



    @Override
    public void onCreate(SQLiteDatabase db) {
        // テーブルの作成
        db.execSQL("CREATE TABLE MyTable " +
                "(" +
                "_id INTEGER PRIMARY KEY AUTOINCREMENT" +
                ", Pref TEXT" +
                ", City0 TEXT" +
                ", City1 TEXT" +
                ", City2 TEXT" +
                ", City3 TEXT" +
                ", City4 TEXT" +
                ",kaisetu TEXT" +
                ", Clear INTEGER" +
                ")");

        // 初期データ投入


        db.execSQL("INSERT INTO MyTable(Pref,City0, City1, City2, City3, City4, kaisetu, Clear) values ('問題文','正解','問1','正解','問3','問4','これは解説です',1);");
}

  @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
**解説画面**


public class kaitou extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //タイトルバーを非表示にする(必ずsetContentViewの前にすること)
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // レイアウトをセットする
        setContentView(R.layout.activity_kaitou);
    }

    // ボタンがタッチされた時の処理
    public void onClick(View v) {

        Intent intent;
        switch (v.getId()) {
            case R.id.button_tugi:
                intent = new Intent(kaitou.this, MainActivity.class);
                // 遷移開始
                startActivity(intent);
                break;
        }
    }
}
java.lang.RuntimeException: Unable to resume activity {com.example.quiz.quizgame/com.example.quiz.quizgame.MainGame}: 
java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

 at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3581)


     Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
        at android.database.CursorWindow.nativeGetString(Native Method)
        at android.database.CursorWindow.getString(CursorWindow.java:438)
        at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
 at com.example.quiz.quizgame.MainGame.setQuestion(MainGame.java:79)
        at com.example.quiz.quizgame.MainGame.onResume(MainGame.java:59)**
        at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1355)
        at android.app.Activity.performResume(Activity.java:7117)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3556)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • keicha_hrs

    2018/11/29 13:56

    同じ質問を複数回投稿するのはやめてください。

    キャンセル

回答 1

0

テーブルから読み出すときに解説まで取得しておいて、それをIntentで渡してはどうでしょうか。

Androidで、起動させるActivityに値を渡す方法

public class MainGame extends Activity {

    String mKaisetu;

    // 問題文セット処理
    private void setQuestion(){

        /*
        SELECT文
        テーブル名 MyTableから _idとQuestionNoがマッチする項目を取得する条件式
         */
        String sql = "SELECT Pref, City0, City1, City2, City3, City4, kaisetu FROM MyTable  ORDER BY RANDOM()";


        mKaisetu = c.getString(c.getColumnIndex("kaisetu"));

    }


        // 選択肢がクリックされた時の処理
        public void onClick(View v) {

            Intent intent;
            switch (v.getId()) {
                case R.id.button1:
                    intent = new Intent(MainGame.this, kaitou.class);
                    intent.putExtra("kaisetu", mKaisetu);
                    // 遷移開始
                    startActivity(intent);
                    break;
        }
public class kaitou extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //タイトルバーを非表示にする(必ずsetContentViewの前にすること)
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // レイアウトをセットする
        setContentView(R.layout.activity_kaitou);

        Intent intent = getIntent();
        String kaisetu = intent.getStringExtra("kaisetu");
        if (kaisetu != null) {
            // 解説を表示する処理
        }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/30 09:25

    複数回投稿について今後気を付けます。すいません。
    教えていただいた通りにしたのですが、maingame.java のset Question();とmKaisetu = c.getString(c.getColumnIndex("kaisetu"));のところでエラーが出ているようで、maingame.javaに遷移する前にアプリが強制終了してしまいます。

    キャンセル

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

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

同じタグがついた質問を見る

  • Android Studio

    4435questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • SQL

    3154questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • データベース

    882questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

  • SQLite

    817questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。