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

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

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

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

Java

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

Android

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

Q&A

解決済

1回答

1684閲覧

(SQLite)指定した箇所の値だけを変更したい

Wassermann

総合スコア18

SQLite

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

Java

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

Android

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

0グッド

0クリップ

投稿2016/01/10 07:16

編集2016/01/10 18:34

###前提
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向け

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

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

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

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

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

yona

2016/01/10 15:54

ログキャットを追記してください。
Wassermann

2016/01/10 18:36

logcatを追記しました。残念ながら文字数制限(本文は30〜10000文字まで)に引っかかったので、関係ありそうな箇所をしぼりました。具体的に「●●の箇所が欲しい」などお申し付けいただけましたら、該当箇所を再掲載いたします。お手数をおかけいたしますが、よろしくお願いいたします。
guest

回答1

0

ベストアンサー

実際にeclipse等で動かしたわけではなくソースコードを追っただけですので、
的外れな指摘かもしれませんがご容赦ください。

下記のコメントがありますが、questionIDの型はintでint[]でないため、
「全ての問題のQuesionIDを取得している」というのがいまいちよく分かりません。

// ★★★ここで全ての問題のQuestionIDを取得しているのがNGです・・・。
// 実際に出題した問題のQuestionIDだけを取得したいです。 questionID = c.getInt(c.getColumnIndex("QuestionID"))

実際に動かしたとき、questionIDにはどんな値が入っているのでしょうか。


それと下記ソースにおいて、ループしているのに常にclearFlag[0]に代入していますが合っていますか。clearFlag[i - 1]では?

// ここで問題の数だけ入れる
for (int i = 1; i < c.getCount(); i++) { clearFlag[0] = c.getInt(0); c.moveToNext(); Log.d(TAG,Integer.toString(clear)); }

投稿2016/01/10 08:22

編集2016/01/10 08:28
ottfoekst

総合スコア28

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

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

Wassermann

2016/01/10 09:07

ottfoekst様、さっそくのご指摘ありがとうございます。 ご指摘いただいた「★★★・・・」は当方の誤った思い込みでした。 QuestionIDには出題された問題の番号が入っておりました。 また、clearFlag[0] → clearFlag[i - 1]に変更しても、出題した問題のCLEARの値が変更されず「0」のままでした。 引き続きどのように修正すべきか、ご教示いただけますでしょうか。 あわせまして、勉強のため、なぜ「clearFlag[0]」が誤りでないかと思われたのかの 理由もご教示いただけますと幸いです。 よろしくお願いいたします。 *SQLiteのQuestionIDが全て0になっていたので、1からの連番になるよう修正しました。
ottfoekst

2016/01/10 14:14

下記が根本的な原因の可能性がありますね。 >*SQLiteのQuestionIDが全て0になっていたので、1からの連番になるよう修正しました。 出題された問題のQuestionIDと同じQuestionIDをもつ(DB上の)問題について、CLEARの値を変更していますので、QuestionIDが全て0であれば全ての問題のCLEARの値が変更されるのではないでしょうか。 一旦"QuestionsTable.db"を削除して再実行等は試されましたか? --- 「clearFlag[0] → clearFlag[i - 1]」の件は、ループの上に下記コードがあり、SQLを実行して得られたレコード数(問題数)分のCLEARの値を保持したいという意図が読み取れたからです(ただ、clearFlagを実際にどこで使っているかはよく分かっていないのですが)。 int[] clearFlag = new int[c.getCount()];
Wassermann

2016/01/10 17:35

再度アドバイスいただき、ありがとうございます。 QuestionIDを連番にしたところ、1問目〜3問目まではQuestionIDが変更されませんでしたが、4問目に回答後、全ての問題のQuestionIDが「1」に変更されました。 また、QuestionsTable.dbにアクセスしようとしたところ Permission deniedが表示されました。Android Manifestに「android:debuggable="true"」を記述しましたが、今度は「run-as: Package 'com.kanji' is unknown」が表示され進めず・・・。 これは今日中に再トライさせてください。 *参考URL: http://blog.takapra.com/2012/04/android%E5%AE%9F%E6%A9%9F%E3%81%A7%E4%BD%9C%E6%88%90%E4%B8%AD%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%87%E3%82%A3%E3%83%AC/ ■clearFlag[0] → clearFlag[i - 1]」の件について ご指導ありがとうございます。 これらの記述は5問全部のCLEARの値を取得したかったのでこう書いてみました。 アプリが完成したら全体のソースコードを再確認して、どのコードがどの処理を実行 しているのかを復習します。そのときに不要だと判断できたら消そうと思います。
Wassermann

2016/01/11 12:35

QuestionsTable.dbを削除しようと試して見ましたが、相変わらず同じエラーで先に進めませんでした。アプリのアンインストール>再インストールでは、意味がないでしょうか。 どうしたらいいのか・・・ 引き続き解決方法をご教示ください。よろしくお願いいたします。
ottfoekst

2016/01/14 13:17

最初に申し上げたとおり開発環境で動かしているわけではないので、恐れ入りますが開発環境で出たエラーについては分かりかねます。QuesionsTable.dbのQuestionIDがちゃんと連番になっているかを確かめる方法はないでしょうか。 既に連番になっていればQuestionsTable.dbを削除しても不具合は解消されませんし、連番になっていないのならどうにかしてQuestionsTable.dbを作りかえる必要があります(※)。 (※)QuestionsTable.dbがあってもなくても起動の度に上書きして作りなおす実装方法がないか等
Wassermann

2016/01/16 15:08

ottfoekst様 せっかくご指導いただいたのにコメントが遅くなり申し訳ございません。 ご教示いただいたとおり、QuestionsTable.dbのQuestionIDがちゃんと連番になっているか、 以下の★の場所にログを入れて確認してみました。 ---------- // 実際に出題した問題のQuestionIDを取得 questionID = c.getInt(c.getColumnIndex("QuestionID"));    ★Log.d("questionID:",Integer.toString("questionID")); ---------- すると全問、QuestionsTable.dbのとおりにquestionIDが出力されました。 これはきちんと連番に設定できているという認識でよろしいでしょうか。 もしきちんと連番に設定できていた場合は、以下のアドバイスをいただいたように他の方法が無いかを検討します。 ----- QuestionsTable.dbがあってもなくても起動の度に上書きして作りなおす実装方法がないか等 ----- 私が見た感じですと、QuesionsTable.dbのQuestionIDは連番に設定されているように 思いますが、認識は合っておりますでしょうか。
ottfoekst

2016/01/16 15:35

連番になっているのであれば、下記の実装方法を探しても意味はありません。連番になっていないときの方法ですので。 すべての問題のCLEARが変更されてしまう別の原因があるはずですが、よくわかっていません。 ----- QuestionsTable.dbがあってもなくても起動の度に上書きして作りなおす実装方法がないか等 -----
Wassermann

2016/01/16 15:49

ottfoekst様 >連番になっているのであれば、下記の実装方法を探しても意味はありません。 >連番になっていないときの方法ですので。 >----- >QuestionsTable.dbがあってもなくても起動の度に上書きして作りなおす実装方法がないか等 >----- 失礼いたしました。勘違いしておりました。 ということは、連番になっているということですね。 自分のほうで全体の構成を見直すなどして、時間をかけて突破口がないか探してみます。 ここまで度重なるご指導・アドバイスをいただき、本当にありがとうございました。 今後もこのテラテイルを利用いたしますので、もしまた私の質問を見かけましたら ぜひ解決までの道案内をしていただけますと幸いです。 解決には至っておりませんが、投稿から日数が経過し閲覧者数も伸びていないこと、 幾度も質問に伴走していただきましたことを鑑み、僭越ながらベストアンサーとさせて いただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問