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

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

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

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

Q&A

解決済

2回答

4104閲覧

CursorのgetString(i)メソッドの呼出について

olee46

総合スコア32

Android Studio

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

0グッド

0クリップ

投稿2017/06/16 02:47

編集2017/06/16 03:29

SQLiteDatabaseのデータベース操作の中で、Cursor.getString(0)を同じループ内で2回呼び出したら、IndexOutOfBoundsExceptionが出てきてしまいました。
呼出を1回にしたところ、エラーが出なかったので、原因は複数回呼び出したことだと思うのですが、getStringやgetIntなどは、一つのpositionにつき1回しか呼び出せないのでしょうか。

一通り検索してみたのですが、そのようなことは書いていなかったので、質問する次第です。

java

1final Cursor c_am = db.query("default_tb", new String[]{"task_col", "checked_col"}, 2 "date_col =? AND time_col =?", new String[] {today_str, "AM"}, 3 null, null, null); 4 boolean bool = c_am.moveToFirst(); 5 while(bool){ 6 //CheckBoxの設定 7 final CheckBox cb = new CheckBox(MainActivity.this); 8 cb.setText(c_am.getString(0)); 9 //CheckBoxにリスナーをつける 10 cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 11 @Override 12 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 13 //DBのアップデート処理 14 ContentValues val = new ContentValues(); 15 val.put("checked_col", 1); 16 db.update("default_tb", val, "task_col =?", new String[]{c_am.getString(0)}); 17 } 18 }); 19 //checkedが1(=TRUE)なら、checkedにする 20 if(c_am.getInt(1) == 1){ 21 cb.setChecked(true); 22 } 23 24 //全体のlayoutに追加 25 amLayout.addView(setRow(cb)); 26 bool = c_am.moveToNext(); 27 } 28 c_am.close();

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

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

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

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

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

yona

2017/06/16 02:52

コードを質問に追記してください。
guest

回答2

0

ベストアンサー

cとc_amは別のインスタンスですよね?
この2つのインスタンスに対するgetStringを「2回呼び出した」と表現しているなら、誤っています。

そもそもこのcはどこで定義、初期化されているインスタンスですか?

また、このwhile文はboolが更新されないので無限ループになりますよ。

投稿2017/06/16 03:19

yona

総合スコア18155

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

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

olee46

2017/06/16 03:30

すみません、現在のコードをこちらのeditorでgetString(0)を2回呼び出していたときのものに戻したため、ミスがありました。また、コピペミスのため更新されないようになってしまっていました。修正しましたのでご確認ください。
yona

2017/06/16 03:40

エラーで終了してしまうのはチェックボタンを押した時ですか? これはc_amが閉じた後なのでデータにアクセスすることはできません。 whileの中で変数にいれて、それをonCheckedChangedの中で使用しましょう。
olee46

2017/06/16 03:52

なるほど、Cursorが閉じたあとでCursorにアクセスしているのでエラーが出たんですね!ありがとうございます。現在はcb.getTextで取得して対策できています。
guest

0

onCheckedChangedはDBアクセスが完了してしまった後でチェックボックスの操作のタイミングで起動されるので、当然その中でカーソルをアクセスしてもアクセスできない・・・

ということではないでしょうか?

投稿2017/06/16 03:36

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問