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

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

新規登録して質問してみよう
ただいま回答率
85.49%
SQLite

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

1621閲覧

SQLiteを使用するタイピングゲームが強制終了します。

Wassermann

総合スコア18

SQLite

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2015/10/03 04:25

###前提・実現したいこと
Androidアプリの開発勉強として、eclipseで以下の流れになるタイピングゲームを作成しています。

前提:SQLiteを使用し、問題にCLEAR = 0を持たせる
1.CLEAR=0の問題だけ画面に1問ずつ表示させ、ユーザーに答えを入力してもらう。
2.1問答えたら正誤判定し、回答したら正誤に関わらずCLEARを 0 → 1 に変更する。
3.正誤に関わらず、次の問題を表示させる
4.以降、「2→3」を繰り返す。全5問。

###発生している問題・エラーメッセージ
・「2」で、正誤に関わらず5問全てのCLEARが 0→1 に変更されてしまいます。
・1問回答するとアプリが強制終了し、その後アプリを再起動しても出題画面で
強制終了します。
なお、CLEARを0→1に変更する処理をコメントアウトすると強制終了は発生しません。
出題内容の重複はあるものの次の問題に進むことができます。
###ソースコード

java

1package com.at.kanji; 2 3import android.app.Activity; 4import android.content.ContentValues; 5import android.database.Cursor; 6import android.database.sqlite.SQLiteDatabase; 7import android.os.Bundle; 8import android.text.SpannableStringBuilder; 9import android.util.Log; 10import android.view.View; 11import android.view.View.OnClickListener; 12import android.widget.Button; 13import android.widget.EditText; 14import android.widget.TextView; 15import android.widget.Toast; 16 17public class Test extends Activity implements OnClickListener { 18 19 Button buttonToNextQuestions; 20 Button buttonTrueOrFalse; 21 Cursor c; 22 EditText edited; 23 int clear; 24 int ret; 25 int questionID; 26 String mondai; 27 String kotae; 28 String sql; 29 String answer; 30 String TAG = "TTT"; 31 TextView tv1; 32 TextView tv2; 33 TextView tv3; 34 Questions questions; 35 36 protected void onCreate(Bundle savedInstanceState) { 37 super.onCreate(savedInstanceState); 38 setContentView(R.layout.activity_Test); 39 40 QuestionsTable(this); 41 tv1 = (TextView)findViewById(R.id.textView1); 42 tv2 = (TextView)findViewById(R.id.textView2); 43 tv3 = (TextView)findViewById(R.id.textView3); 44 buttonToNextQuestions = (Button)findViewById(R.id.button10); 45 buttonToNextQuestions.setOnClickListener(this); 46 // buttonTrueOrFalse = (Button)findViewById(R.id.button11); 47 } 48 49 50 /************************************ 51 * 問題を表示させる処理 * 52 ************************************/ 53 public void QuestionsTable (Test test) { 54 55 questions = new Questions(this); 56 SQLiteDatabase db = questions.getReadableDatabase(); 57 58 // CLEARの値を取得して clearFlagに入れる処理 59 sql = "SELECT CLEAR FROM QuestionsTable"; 60 61 c = db.rawQuery(sql,null); 62 c.moveToFirst(); 63 64 clear = c.getInt(c.getColumnIndex("CLEAR")); 65 Log.d(TAG,Integer.toString(clear)); 66 67 int[] clearFlag = new int[c.getCount()]; 68 69 // ここで問題の数だけ入れる 70 for (int i = 0; i < c.getCount(); i++) { 71 clearFlag[0] = c.getInt(0); 72 c.moveToNext(); 73 Log.d(TAG,Integer.toString(clear)); 74 } 75 76 // CLEARが0の問題だけを選んで画面に出力する 77 sql = "SELECT KANJI,KOTAE,_id FROM QuestionsTable WHERE (CLEAR = 0) AND KANJIno == KOTAEno ORDER BY random() limit 1 "; 78 79 c = db.rawQuery(sql.toString(),null); 80 c.moveToFirst(); 81 82 mondai = c.getString(c.getColumnIndex("KANJI")); 83 kotae = c.getString(c.getColumnIndex("KOTAE")); 84 questionID = c.getInt(c.getColumnIndex("_id")); 85 86 Log.d("TTTQuestionID",Integer.toString(questionID)); 87 88 c.close(); 89 db.close(); 90 91 edited = (EditText)findViewById(R.id.editText1); 92 tv1 = (TextView)findViewById(R.id.textView1); 93 tv1.setText(mondai); 94 } 95 96 97 /************************************ 98 * 入力された文字を取得 * 99 ************************************/ 100 public String message() { 101 edited.getText(); 102 SpannableStringBuilder sb = (SpannableStringBuilder)edited.getText(); 103 answer = sb.toString(); 104 return answer; 105 } 106 107 108 /************************************** 109 * 正誤判定 * 110 **************************************/ 111 public void TrueOrFalse() { 112 answer = message(); 113 if (answer.equals(kotae)){ 114 Toast.makeText(this, "正解!", Toast.LENGTH_SHORT).show(); 115 }else{ 116 Toast.makeText(this, "残念!", Toast.LENGTH_SHORT).show(); 117 } 118 changeValueOfClear(); //★ここでアプリが強制終了する★ 119 } 120 121 122 /************************************ 123 * 「次の問題へ」ボタンが押されたときの処理 * 124 ************************************/ 125 public void onClick (View v) { 126 TrueOrFalse(); 127 edited.getText().clear(); 128 edited = (EditText)findViewById(R.id.editText1); 129 QuestionsTable(this); 130 } 131 132 133 /************************************ 134 * DBのCLEARの値を変更する処理 * 135 ************************************/ 136 public void changeValueOfClear() { 137 138 Questions questions = new Questions(this); 139 SQLiteDatabase db = questions.getWritableDatabase(); 140 141 c = db.rawQuery(sql.toString(),null); 142 c.moveToFirst(); 143 144 questionID = c.getInt(c.getColumnIndex("_id")); 145 146 ContentValues values = new ContentValues(); 147 values.put("CLEAR",1); 148 149 try{ 150 ret = db.update("QuestionsTable",values,"_id = questionID",null); 151 }finally{ 152 c.close(); 153 db.close(); 154 } 155 156 // CLEARの値の変更に失敗 157 if (ret == -1) { 158 Toast.makeText(this, "終了します。", Toast.LENGTH_SHORT).show(); 159 }else{ 160 161 } 162 } 163} 164

★SQLiteのテーブル

sql

1public Questions(Context context) { 2 /* ここで任意のデータベースファイル名と、バージョンを指定する。 3 * データベースファイル名 = QuestionsTable.db 4 * バージョン = 1 5 */ 6 7 super(context,"QuestionsTable.db",null,1); 8 9 } 10 11 @Override 12 public void onCreate(SQLiteDatabase db) { 13 14 db.execSQL("CREATE TABLE QuestionsTable" + 15 "(" + 16 "_id INTEGER PRIMARY KEY AUTOINCREMENT" + 17 ",QuestionID" + 18 ", KANJI TEXT" + 19 ", KOTAE TEXT" + 20 ", KANJIno INTEGER" + 21 ", KOTAEno INTEGER" + 22 ", CLEAR INTEGER" + 23 ")"); 24 25 // 初期データ投入 26 db.execSQL("INSERT INTO QuestionsTable(QuestionID,KANJI,KOTAE,KANJIno,KOTAEno,CLEAR) values (1,'山','やま',1,1,0);"); 27 db.execSQL("INSERT INTO QuestionsTable(QuestionID,KANJI,KOTAE,KANJIno,KOTAEno,CLEAR) values (2,'川','かわ',2,2,0);"); 28 db.execSQL("INSERT INTO QuestionsTable(QuestionID,KANJI,KOTAE,KANJIno,KOTAEno,CLEAR) values (3,'木','き',3,3,0);"); 29 db.execSQL("INSERT INTO QuestionsTable(QuestionID,KANJI,KOTAE,KANJIno,KOTAEno,CLEAR) values (4,'林','はやし',4,4,0);"); 30 db.execSQL("INSERT INTO QuestionsTable(QuestionID,KANJI,KOTAE,KANJIno,KOTAEno,CLEAR) values (5,'森','もり',5,5,0);"); 31 } 32 33 @Override 34 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 35 36 } 37}

★AndroidManifest

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.at.kanji" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="20" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Test" android:label="@string/title_activity_Test" > </activity> <activity android:name=".Questions" android:label="@string/title_activity_questions" > </activity> </application> </manifest>

★logcat

logcat

110-03 12:37:18.879 9477 9477 E AndroidRuntime: FATAL EXCEPTION: main 210-03 12:37:18.879 9477 9477 E AndroidRuntime: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

###補足情報(言語/FW/ツール等のバージョンなど)
Android4.4向け

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下、気が付いた点です。

  1. db create での QuestionIDの型が指定されていない。

",QuestionID" + -> ",QuestionID INTEGER" +
2. clearが0の問題だけを選ぶためのSQLのKANJInoとKOTAEnoの比較が"=="になっている。
"SELECT ... AND KANJIno == KOTAEno ..."
-> "SELECT ... AND KANJIno = KOTAEno ..."
3. 上記のsqlにrandomを指定しているが、これだと読込んで表示する問題と、更新するときのレコードが違ってくる。
-> randomの指定をやめるか、読みだしたときの"_id"を保存しておき、その"_id"で更新する。
4. changeValueOfClearメソッド内のdb.updateでquestionIDが指定されていない。
db.update("QuestionsTable",values,"_id = questionID",null);
-> db.update("QuestionsTable",values,"_id = " + questionID /ここ★★/,null);
5. Queryを行ったとき、クエリの結果が0件の場合を考慮していない。

投稿2015/10/03 10:04

編集2015/10/03 10:06
akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Wassermann

2015/10/04 05:11 編集

akiruno-oneone様 ご指摘いただきありがとうございます! 1,2,4の内容に修正したところ強制終了がなくなりました! *5に対応していないので、そのせいの強制終了はありますが・・・今はまずランダムに出題したいので、こちらの対応は後回しとさせてください。 3についてはいただいた内容で考え直します。また進展なければ別途質問させていただきますので、もしよろしければまたご指導いただけますと幸いです。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問