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

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

ただいまの
回答率

88.57%

android studioにてデータベースの値をintentで渡そうとした際にアプリが強制終了してしまう

解決済

回答 1

投稿

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

hanamero50

score 18

クイズゲームを作っていまして、データベースからのデータをボタンを押した後にintentで次のページへデータを渡せばよいと教えていただいたのでその通りにやってみたのですが、最初のスタートボタンを押して問題表示画面に遷移して問題表示されるはずが遷移せずに強制終了してしまいます。

どうすればよいかわからないので教えていただきたいです。

MainGame.java
public class MainGame extends Activity {


    String Seikai;
    String mKaisetu;


    @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();
            mKaisetu = c.getString(c.getColumnIndex("kaisetu"));


            // データベースから取ってきたデータを変数にセット
            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);
                    intent.putExtra("kaisetu", mKaisetu);
                    // 遷移開始
                    startActivity(intent);
                    break;

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

                case R.id.button3:
                    intent = new Intent(MainGame.this, kaitou.class);
                    intent.putExtra("kaisetu", mKaisetu);
                    // 遷移開始
                    startActivity(intent);
                    break;
                case R.id.button4:
                    intent = new Intent(MainGame.this, kaitou.class);
                    intent.putExtra("kaisetu", mKaisetu);
                    // 遷移開始
                    startActivity(intent);
                    break;
            }
        }
}
強制終了してしまう際のlogcat
2018-12-03 21:48:09.749 4961-4961/com.example.quiz.quizgame E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.quiz.quizgame, PID: 4961
    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)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3621)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2862)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     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)
該当コード setQuestion();

        at com.example.quiz.quizgame.MainGame.onResume(MainGame.java:59)
 該当コード mKaisetu = c.getString(c.getColumnIndex("kaisetu"));

 at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1355)
        at android.app.Activity.performResume(Activity.java:7117)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3556)
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" +
                ")");

        // 初期データ投入

        //記述例 正解を問1~4のいずれかに入れる
        db.execSQL("INSERT INTO MyTable(Pref,City0, City1, City2, City3, City4,kaisetu,Clear) values ('問題文','正解','問1','正解','問3','問4','これは解説です',1);");


    }

    /*
     * onUpgradeメソッド
     * onUpgrade()メソッドはデータベースをバージョンアップした時に呼ばれる
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

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

このSQL文の中にkaisetuがありませんから、getColumnIndex("kaisetu")のときにアプリが落ちるでしょう。前回の回答でもkaisetuを付け加えてたものを示したはずです。説明不足だったのかもしれないのでそこは申し訳ないですが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/03 23:29

    前回の回答を実践してみてうまく動かなかったことによる質問ならば、新たに立てるのではなく前の質問へのコメント投稿をするべきだと思います。それから、回答に対してノーレスポンスというのは、答える側にとっては回答意欲を失わせる行為です。前アカウント(新アカウントを作ること自体非推奨だが)から含めて回答のついたものに対して然るべき対応をいただけないのであれば、次回以降は回答しません。

    キャンセル

  • 2018/12/06 10:01

    返信遅れてもうしわけありません。
    レスポンスをしたつもりでしたが、うまくできていないようでした。
    私も真摯な対応に努めるようにします。
    教えていただいた回答の方はおかげ様でうまくいきました。本当に助かります。

    キャンセル

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

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

関連した質問

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