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

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

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

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

Java

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

Android Studio

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

Q&A

解決済

2回答

3400閲覧

データベースより一定数ランダムに取り出したデータをラジオボタンにsetしたい

Haru_T

総合スコア34

SQLite

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

Java

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

Android Studio

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

0グッド

0クリップ

投稿2016/10/20 07:18

英単語帳アプリを作っています。
その中で意味テストの機能をつけようと思っています。
概要は、データベースより単語をランダムで取り出し、4つのラジオボタンの選択肢から正解だと思う意味を一つを選び、別で用意したボタンを押すことで正誤判定を行い、TextViewに正解や、不正解(+正しい意味)を表示するというような感じです。

そこで、とりあえずの段階で、ランダムに選んンでWordviewに記述した単語の意味をラジオボタン1に、そして別でランダムに3つの(他の単語の)の意味を取り出してきて、ラジオボタン2~4のテキストにsetしようと考えています。

しかし、今のままのコードでは、2~4がすべて同じ結果を表示してしまいます。
SELECT文はラジオボタン一つに対し一つ用意すべきなのでしょうか、、、

それにデータベースより取り出した(正解の意味も含めた)合計4つの意味をラジオボタンにランダムに格納する方法が分かりません。Listを作り Collections.shuffle(リスト名);でシャッフルすべきなのでしょうか、、、

java

1public class MeanActivity extends AppCompatActivity { 2 private TextView wordView; 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_mean); 8 9 DataBaseHelper dbhelper = new DataBaseHelper(this); 10 SQLiteDatabase databaseObject = dbhelper.getReadableDatabase(); 11 12 String query = "SELECT * " + "FROM WordData order by random()"; 13 String sql = "SELECT * " + "FROM WordData order by random() limit 3"; 14 Cursor cursor = databaseObject.rawQuery(query, null); 15 Cursor cursor1 = databaseObject.rawQuery(sql, null); 16 cursor.moveToFirst(); 17 cursor1.moveToFirst(); 18 19 String word = cursor.getString(0); 20 String mean1 = cursor.getString(3); 21 String mean2 = cursor1.getString(3); 22 String mean3 = cursor1.getString(3); 23 String mean4 = cursor1.getString(3); 24 25 wordView = (TextView) findViewById(R.id.word_view); 26 wordView.setText(word); 27 28 RadioButton rg1 = (RadioButton) findViewById(R.id.RadioButton1); 29 rg1.setText(mean1); 30 31 RadioButton rg2 = (RadioButton) findViewById(R.id.RadioButton2); 32 RadioButton rg3 = (RadioButton) findViewById(R.id.RadioButton3); 33 RadioButton rg4 = (RadioButton) findViewById(R.id.RadioButton4); 34 35 rg2.setText(mean2); 36 rg3.setText(mean3); 37 rg4.setText(mean4); 38 39 } 40}

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

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

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

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

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

guest

回答2

0

ベストアンサー

cursor1をmoveToNext()でそれぞれDBから取得した値をmean2,3,4に入れると値が変わります。

あと、気になったのですが、とても低い確率かもしれませんが、このSQL2つだとcursorとcursor1のどれかが被ってしまうような気もします。
cursorで取得したものはcursor1で取得できないようにしておいたほうがよいかもしれません。
あと、描画がどのようになっているかがわかりませんが、常にrg1が正解になるような気もしています。

投稿2016/10/20 07:47

編集2016/10/20 07:49
s.t.

総合スコア2021

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

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

Haru_T

2016/10/20 08:11

cursorの使い方を誤っていました、、、 cursor1.moveToFirst(); String mean2 = cursor1.getString(3); RadioButton rg2 = (RadioButton) findViewById(R.id.RadioButton2); rg2.setText(mean2); cursor1.moveToNext(); これをラジオボタンの数だけ繰り返したのでいいんでしょうか? それとアドバイスいただいている点に関してですが、 私の場合プログラミングに慣れているわけではないので、段階を踏んで進めているんです。とりあえず4つのラジオボタンに4つの別のものを表示させて、それから正解を除く3つにすること、そして正解も含めて4つの順番をランダムにしていこうと考えています。 簡単にできるような方法があればいいのですが、一つひとつ調べながら進めていく予定です、ありがとうございます!!
s.t.

2016/10/20 08:24

>これをラジオボタンの数だけ繰り返したのでいいんでしょうか? そうです、それで問題ないと思います。 不慣れだとのことですので余計なお節介で申し訳ありませんでした。 いちおう、rg1~4に入れる前段階で、stringのlistに入れてシャッフルするという手もありますので参考ください。 正解含めて4つの意味をlistに入れてシャッフルしてからrgに入れていけば順番もランダムになります。 http://yusuke-hata.hatenablog.com/entry/2013/11/26/134434 答えが被ってしまう件につきましても、 「最初に抜き出した正解ではないもの」というwhere句の条件にして2つめのSQLを実行すれば問題ないかと思われます。
Haru_T

2016/10/20 08:53

残り3つの選択肢の部分できました!ありがとうございます!! シャッフルの件、かぶってしまう件にも丁寧に教えていただきありがとうございます。 ぜひ参考にさせて頂きます!! まずはlistを作るところからやってみます。
guest

0

cursor1.moveToFirst(); String mean2 = cursor1.getString(3); String mean3 = cursor1.getString(3); String mean4 = cursor1.getString(3);

moveToFirst()メソッドでcursor1を先頭行に合わせ、そのまま3回取り出していることが原因です。
データを1件取り出したら、moveToNext()メソッドでcorsor1が指す先を次の行に進めて下さい。

提示のコードではgetString(3)を3回行う間cursor1はずっと先頭行を指している(次の行に進めていない)ので、当然取り出すデータは同じ内容になります。

投稿2016/10/20 07:40

KaedeKazane

総合スコア408

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

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

Haru_T

2016/10/20 08:07

よく考えればわかることでした、、、 cursor1.moveToFirst(); String mean2 = cursor1.getString(3); RadioButton rg2 = (RadioButton) findViewById(R.id.RadioButton2); rg2.setText(mean2); cursor1.moveToNext(); これをmean2~4まで繰り返すということでいいのでしょうか?
KaedeKazane

2016/10/20 08:29 編集

それでも良いですし、変数名を分けるのであれば cursor1.getString() cursor1.moveToNext() cursor1.getString() ... のようにして元のコードのように取得部分でまとめてしまうのも良いかと思います。 ちなみに自分なら、適宜配列等を活用して全体的にループで回すような記述にします。 ひとまず動作できる段階まで進んだら、そちらも考えてみると良いですよ。
Haru_T

2016/10/20 08:51

できました!!ありがとうございます。 私もループでできればコードが少なくて済むのかなと考えていました。 がんばってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問