###前提
Androidアプリの勉強として、eclipseで以下のタイピングゲームを作成しています。
前提:SQLiteを使用し、問題にCLEAR = 0を持たせる
1.CLEAR=0の問題だけ画面に1問ずつ表示させ、ユーザーに答えを入力してもらう。
2.1問答えたら正誤判定し、回答したら正誤に関わらずCLEARを 0 → 1 に変更する。
3.正誤に関わらず、次の問題を表示させる
4.以降、「2→3」を繰り返す。全5問。
###エラー
「2」で、正誤に関わらず5問全てのCLEARが 0→1 に変更されてしまいます。
なお、CLEARを0→1に変更する処理をコメントアウトすると強制終了は発生しません。
出題内容の重複はあるものの次の問題に進むことができます。
###期待動作
「2」で回答した問題のClearだけが 0→1 に変更されるようにしたいです。
###ソースコード
java
1 2<インポート文は省略> 3 4public class Test extends Activity implements OnClickListener { 5 6 Button buttonToNextQuestions; 7 Button buttonTrueOrFalse; 8 Cursor c; 9 EditText edited; 10 int clear; 11 int ret; 12 int questionID; 13 String questionID2; 14 String mondai; 15 String kotae; 16 String sql; 17 String answer; 18 String TAG = "TTT_clear"; 19 TextView tv1; 20 TextView tv2; 21 TextView tv3; 22 Questions questions; 23 24 25 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.activity_first_year_term1); 29 30 Log.d(TAG,"0 : onCreate"); 31 32 QuestionsTable(this); 33 tv1 = (TextView)findViewById(R.id.textView1); 34 tv2 = (TextView)findViewById(R.id.textView2); 35 tv3 = (TextView)findViewById(R.id.textView3); 36 buttonToNextQuestions = (Button)findViewById(R.id.button10); 37 buttonToNextQuestions.setOnClickListener(this); 38 39 Log.d(TAG,"2 : onCreate"); 40 } 41 42 43 /************************************ 44 * 問 題 を 表 示 さ せ る 処 理 * 45 ************************************/ 46 public void QuestionsTable (Test test) { 47 48 questions = new Questions(this); 49 SQLiteDatabase db = questions.getReadableDatabase(); 50 51 // CLEARの値を取得して clearFlagに入れる処理 52 sql = "SELECT CLEAR FROM QuestionsTable"; 53 54 c = db.rawQuery(sql,null); 55 c.moveToFirst(); 56 57 clear = c.getInt(c.getColumnIndex("CLEAR")); 58 Log.d(TAG,Integer.toString(clear)); 59 60 int[] clearFlag = new int[c.getCount()]; 61 62 // ここで問題の数だけ入れる 63 for (int i = 1; i < c.getCount(); i++) { 64 clearFlag[0] = c.getInt(0); 65 c.moveToNext(); 66 Log.d(TAG,Integer.toString(clear)); 67 } 68 69 if (clear == 0){ 70 // CLEARが0の問題だけを選んで画面に出力する 71 sql = "SELECT KANJI,KOTAE,CLEAR,QuestionID FROM QuestionsTable WHERE (CLEAR = 0) AND KANJIno = KOTAEno ORDER BY random() limit 1"; 72 c = db.rawQuery(sql.toString(),null); 73 c.moveToFirst(); 74 75 mondai = c.getString(c.getColumnIndex("KANJI")); 76 kotae = c.getString(c.getColumnIndex("KOTAE")); 77 78 // 実際に出題した問題のQuestionIDを取得 79 questionID = c.getInt(c.getColumnIndex("QuestionID")); 80 81 edited = (EditText)findViewById(R.id.editText1); 82 tv1 = (TextView)findViewById(R.id.textView1); 83 84 tv1.setText(mondai); 85 86 }else if (clear <=1){ 87 tv1.setText("nothing"); 88 } 89 } 90 91 92 /************************************ 93 * 入 力 さ れ た 文 字 を 取 得 * 94 ************************************/ 95 public String message() { 96 edited.getText(); 97 SpannableStringBuilder sb = (SpannableStringBuilder)edited.getText(); 98 answer = sb.toString(); 99 Log.d(TAG,"3 : message"); 100 return answer; 101 } 102 103 104 /************************************** 105 * 正 誤 判 定 * 106 **************************************/ 107 public void TrueOrFalse() { 108 answer = message(); 109 if (answer.equals(kotae)){ 110 Toast.makeText(this, "正解", Toast.LENGTH_SHORT).show(); 111 Log.d(TAG,"4-1 : TrueOrFalse seikai"); 112 113 }else{ 114 Toast.makeText(this, "残念", Toast.LENGTH_SHORT).show(); 115 Log.d(TAG,"4-2 : TrueOrFalse zannen"); 116 } 117 changeValueOfClear(); 118 } 119 120 121 /**************************************** 122 * 「次の問題へ」ボタンが押されたときの処理 * 123 ****************************************/ 124 public void onClick (View v) { 125 126 TrueOrFalse(); 127 128 edited.getText().clear(); 129 edited = (EditText)findViewById(R.id.editText1); 130 QuestionsTable(this); 131 132 Log.d(TAG,"5 : onClick"); 133 } 134 135 136 /************************************ 137 * DBのCLEARの値を変更する処理 * 138 ************************************/ 139 public void changeValueOfClear() { 140 141 Questions questions = new Questions(this); 142 SQLiteDatabase db = questions.getWritableDatabase(); 143 144 c = db.rawQuery(sql.toString(),null); 145 c.moveToFirst(); 146 147 ContentValues values = new ContentValues(); 148 values.put("CLEAR",1); 149 150 Log.d("TTTQuestionID_2",Integer.toString(questionID)); 151 Log.d("TTTERROR","change1"); 152 153 try{ 154 ret = db.update("QuestionsTable",values,"QuestionID = ?", new String[]{String.valueOf(questionID)}); 155 }finally{ 156 c.close(); 157 db.close(); 158 } 159 160 Log.d("TTTERROR","change2"); 161 // 値の変更に失敗 162 if (ret == -1) { 163 Toast.makeText(this, "終了です", Toast.LENGTH_SHORT).show(); 164 }else{ 165 166 } 167 Log.d("TTTERROR","change3"); 168 169 } 170} 171
★SQLiteのテーブル
SQLite
1package com.at.kanji; 2 3<import文は省略> 4 5public class Questions extends SQLiteOpenHelper{ 6 7 public Questions(Context context) { 8 /*データベースファイル名 = QuestionsTable.db 9 * バージョン = 1 10 */ 11 12 super(context,"QuestionsTable.db",null,1); 13 14 } 15 16 @Override 17 public void onCreate(SQLiteDatabase db) { 18 19 db.execSQL("CREATE TABLE QuestionsTable" + 20 "(" + 21 "_id INTEGER PRIMARY KEY AUTOINCREMENT" + 22 ", QuestionID INTEGER" + 23 ", KANJI TEXT" + 24 ", KOTAE TEXT" + 25 ", KANJIno INTEGER" + 26 ", KOTAEno INTEGER" + 27 ", CLEAR INTEGER" + 28 ")"); 29 30 // 初期データ投入 31 db.execSQL("INSERT INTO QuestionsTable(QuestionID,KANJI,KOTAE,KANJIno,KOTAEno,CLEAR) values (1,'山','やま',1,1,0);"); 32 db.execSQL("INSERT INTO QuestionsTable(QuestionID,KANJI,KOTAE,KANJIno,KOTAEno,CLEAR) values (2,'川','かわ',2,2,0);"); 33 db.execSQL("INSERT INTO QuestionsTable(QuestionID,KANJI,KOTAE,KANJIno,KOTAEno,CLEAR) values (3,'木','き',3,3,0);"); 34 db.execSQL("INSERT INTO QuestionsTable(QuestionID,KANJI,KOTAE,KANJIno,KOTAEno,CLEAR) values (4,'林','はやし',4,4,0);"); 35 db.execSQL("INSERT INTO QuestionsTable(QuestionID,KANJI,KOTAE,KANJIno,KOTAEno,CLEAR) values (5,'森','もり',5,5,0);"); 36 } 37 38 @Override 39 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 40 41 } 42} 43
★logcat
text
1 2★1問目の正誤判定ー正解 302:10:13.150 23449 23449 D TTT_clear: 4-1 : TrueOrFalse seikai 4 5★再度QuestionIDを取得(出題した問題のQuestionIDになっているか) 602:10:13.160 23449 23449 D TTTQuestionID_2: 3 7 8★★★CLEARの値が変更されない 902:10:13.160 23449 23449 D TTTERROR: change1 1002:10:13.170 23449 23449 D TTTERROR: change2 1102:10:13.170 23449 23449 D TTTERROR: change3 1202:10:13.180 23449 23449 D TTT_clear: 0 1302:10:13.180 23449 23449 D TTT_clear: 0 1402:10:13.180 23449 23449 D TTT_clear: 0 1502:10:13.180 23449 23449 D TTT_clear: 0 1602:10:13.180 23449 23449 D TTT_clear: 0 17 18★次の問題のQuestionIDを取得 1902:10:13.180 23449 23449 D TTTQuestionID:: 4 2002:10:13.180 23449 23449 D TTT_clear: 5 : onClick 2102:10:14.301 14774 23545 I QCNEA : |NIMS| getaddrinfo: hostname android.clients.google.com servname NULL numeric 0 appname 2202:10:14.321 18526 18526 D Finsky : [1] AppStatesReplicator.handleContentSyncResponse: Completed 2 account content syncs with 0 successful. 2302:10:14.321 18526 18526 D Finsky : [1] ContentSyncService$5.onFinished: Installation state replication failed. 2402:10:14.321 18526 18526 D Finsky : [1] ContentSyncService$5.onFinished: Scheduling replication attempt 1. 2502:10:19.426 15312 15312 E SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 26 27★入力された文字列を取得 2802:10:20.797 23449 23449 D TTT_clear: 3 : message 29 30★正誤判定ー正解 3102:10:20.817 23449 23449 D TTT_clear: 4-1 : TrueOrFalse seikai 32 33★QuestionIDを再度取得 3402:10:20.827 23449 23449 D TTTQuestionID_2: 4 35 36★★★CLEARが変更されず 3702:10:20.827 23449 23449 D TTTERROR: change1 3802:10:20.837 23449 23449 D TTTERROR: change2 3902:10:20.837 23449 23449 D TTTERROR: change3 4002:10:20.857 23449 23449 D TTT_clear: 0 4102:10:20.857 23449 23449 D TTT_clear: 0 4202:10:20.857 23449 23449 D TTT_clear: 0 4302:10:20.857 23449 23449 D TTT_clear: 0 4402:10:20.857 23449 23449 D TTT_clear: 0 45 46★次の問題のQuestionIDを取得 4702:10:20.857 23449 23449 D TTTQuestionID:: 0 4802:10:20.857 23449 23449 D TTT_clear: 5 : onClick 4902:10:31.257 15006 15414 V BgRingerService: bgRingerCancel call pkg:com.antivirus id:19 5002:10:31.838 15006 15088 E sharp-HapticFeedbackManager: For given effectId:1, we can not find corresponding soundEffectId from AudioManager. 5102:10:31.918 15312 15312 E SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 52 53★入力された文字列を取得 5402:10:32.799 23449 23449 D TTT_clear: 3 : message 55 56★正誤判定 5702:10:32.809 23449 23449 D TTT_clear: 4-1 : TrueOrFalse seikai 58 59★QuestionIDを再度取得 6002:10:32.819 23449 23449 D TTTQuestionID_2: 0 61 62★★★全てのQuestionIDが「1」に変更される 6302:10:32.819 23449 23449 D TTTERROR: change1 6402:10:32.829 23449 23449 D TTTERROR: change2 6502:10:32.829 23449 23449 D TTTERROR: change3 6602:10:32.849 23449 23449 D TTT_clear: 1 6702:10:32.849 23449 23449 D TTT_clear: 1 6802:10:32.849 23449 23449 D TTT_clear: 1 6902:10:32.849 23449 23449 D TTT_clear: 1 7002:10:32.849 23449 23449 D TTT_clear: 1 71 72★ 出題できる問題が無いため画面には「nothing」を表示した 7302:10:32.849 23449 23449 D TTT_clear: 5 : onClick 74
###補足
Android4.4向け
回答1件
あなたの回答
tips
プレビュー