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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

6回答

4730閲覧

if(c.moveToFirst()) { この中に入れません。なぜfalseになるのでしょうか?

edoooooo

総合スコア476

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2017/04/21 13:15

編集2017/04/21 14:27

if(c.moveToFirst()) { この中に入れません。LogもToastも表示できません。どうすればいいでしょうか?
どうぞ宜しくお願い致します。

HandlerThread handlerThread = new HandlerThread("other");
handlerThread.start();
このコードが一番上にあったのですが、別のthreadで実行してることが原因でしょうか?

java

1 2 3 HandlerThread handlerThread = new HandlerThread("other"); 4 handlerThread.start(); 5 new Handler(handlerThread.getLooper()).postDelayed(new Runnable() { 6 @Override 7 public void run() { 8 9 yobareta++; 10 11 String sql= "SELECT CONTENT FROM " + table + 12 13 " WHERE ID = " + yobareta ; 14 15 //すでにテーブルに数字が入ってるから、テーブルを新しくして、createもするようにする 16 17 Cursor c = db.rawQuery(sql, null); 18 19 Toast.makeText(MainActivity.this, R.string.msg_popup, Toast.LENGTH_SHORT).show(); 20 21 22 String yyy=String.valueOf(yobareta); 23 Log.v("yobaretaの数は: ",yyy); 24 25 if(c.moveToFirst()) { 26 String cccc = c.getString(c.getColumnIndex(Databaseset.Users.COL_CONTENT)); 27 28 Log.v("yobareruに対するcontent",cccc); 29 Toast ts = Toast.makeText(MainActivity.this, cccc, Toast.LENGTH_LONG); 30 ts.setGravity(Gravity.CENTER, 0, 0); 31 ts.show(); 32 } 33 34 c.close(); 35 36 } 37 }, 5);

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

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

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

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

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

guest

回答6

0

根本的に、「デバッグ」というのはあなたが思っているほど単純ではありません。
ドキュメントを調べてバグが解決するならこの世に「デバッグ」などという言葉は存在しません。

まずif(c.moveToFirst())に入れなくて困っているということは、本来なら「入る」ということを想定していますよね?しかし現実には入らない。
なぜか?それはすなわちc.moveToFirst()予想に反してfalseを返しているというところまでは考えられると思います。
では、**予想に反してfalseを返しているのはなぜか?となると、そもそもこのc.moveToFirst()というメソッドはどういう値を返すものなのか?という思考に自然になるはずなのです。yonaさんに促されるまでそれすら調べていなかったようですが。
結果、"カーソルが空の場合にfalseを返す"という事実を得たわけです。となると
これはおかしいですよね?**なぜなら、あなたはデータベースから情報を得てそれに対して何らかの処理をしようとして、このメソッドを書いているわけですから、**データが得られないという状態はおかしいわけです。**yonaさんも言っていますが、きちんと目的をもって、まともな思考をしてコードを書いているのであれば、このような疑問がわかないというのはおかしい。はっきり言ってプログラミングする資格ないです。

話を戻します。では、**なぜデータが得られないのか?**を追求するのが次のステップになります。SQL文にエラーは出ていないとのことなので、考えられるのは
0. データベースにデータが入っていない
0. 対象のデータベースに"CONTENT"というカラムが存在しない

などと思われます。となると、データベースの内容そのものを確認するのが早いかと思います。
こうなれば、次にやるべきはAndroidに保存されたデータベースの閲覧方法を調べるということになります。

そもそもこのサイトが「思考するエンジニアのためのQ&Aプラットフォーム」なのですから、思考しない人間にここを使う資格はありません。あなたは「考えている」というでしょうが、はっきり言って現段階では「考える」うちに入っていません。

投稿2017/04/21 15:23

swordone

総合スコア20649

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

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

edoooooo

2017/04/21 15:55

ありがとうございます。 こんかいは、 if(cb.moveToFirst()) {} if(cb.moveToFirst()) { String cccc = cb.getString(cb.getColumnIndex(Databaseset.Users.COL_CONTENT)); という形で、解決しましたが、データベースの閲覧方法は、知らないと大変なので、調べます。ありがとうございます。
guest

0

  1. これまでの質問から、変数や定数を正しく理解できていないようですので

まず、SQLをtableyobaretaを利用しないものにしてください。
String sql = "SELECT CONTENT FROM テーブル名 WHERE ID = 値"; ←このような形に置き換えてください
※ わかっているとは思いますが、上記のテーブル名は作成しているテーブルに則したものにしてください。
2. テーブルの中に入っている実際の値を記載してください。
「こういう値が入っているはず」といった想像上のものはNGです。
SELECT ID FROM テーブル名でテーブルにSQLを発行した時の結果をそのまま提示してください。
SELECT CONTENT FROM テーブル名ではなくSELECT ID FROM テーブル名でした。すみません。

4/21 最終確認の後追記

まず結論から言うと、あなたのテーブル aaazzzzzaaas の中に IDが1となるデータは入っていません。
そのため SELECT CONTENT FROM aaazzzzzaaas WHERE ID = 1 を実行しても何もとれず
実行結果を取り扱うCursor cは空になります。ということは、後はもうわかりますね?

一旦、アプリケーションの開発は諦めて、SQLでのDB操作に限定した学習をすべきです。
今のままでDB連携したアプリケーションを作るのは不可能です

投稿2017/04/21 13:38

編集2017/04/21 15:01
fcrow

総合スコア96

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

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

edoooooo

2017/04/21 13:52

ありがとうございます。 sqlをString sql = "SELECT CONTENT FROM テーブル名 WHERE ID = 値";かえても結果はおなじでした。 SELECT ID FROM テーブル名 とした場合ですが、if(c.moveToFirst()) のなかに入れないため、表示できませんでした。
fcrow

2017/04/21 13:54

「作成しているテーブルに則したものにしてください。」と念押ししたつもりなのですが まさかそのままコピペで書き換えたのでしょうか? テーブル名の部分はどう記入しましたか? 値の部分はどう記入しましたか?
edoooooo

2017/04/21 14:03 編集

しっかり変えました。 String sql= "SELECT * FROM " + "aaazzzzzaaas" + " WHERE ID = " + 1 ; とのように実行しました。
fcrow

2017/04/21 14:22

String sql = "SELECT CONTENT FROM aaazzzzzaaas WHERE ID = 1"; 指示した通り置き換えたのであれば、上記のようになるんですけどね・・・ まぁ 1. の質問で欲しかった情報は得られたのでひとまず良しとします。 1. の質問および 2. の質問に関してですが、どちらもエラーは出ていないのでしょうか? もし出ていないのであれば aaazzzzzaaas テーブルに、IDが 1 が設定されたデータが入っていない可能性が考えられますが aaazzzzzaaas テーブルにどんなデータが入っているのでしょうか(2.の質問でほしい情報です。)
fcrow

2017/04/21 14:24

すみません、一つ追加です。 SQLを以下の通りにした場合、エラーは発生しますか? String sql = "SELECT COUNT(*) FROM aaazzzzzaaas";
edoooooo

2017/04/21 14:28 編集

Databaseset.Users._ID integer primary key autoincrement, (自動連番のid) Databaseset.Users.COL_CONTENT text (コメント) Databaseset.Users.COL_DATA text (calendarで取得した日時) です。
edoooooo

2017/04/21 14:32

Failed to read row 0, column -1 from a CursorWindow which has 1 rows, 1 columns. 04-21 23:30:25.611 22991-23227/com.example.android.sample.posto W/dalvikvm: threadid=11: thread exiting with uncaught exception (group=0x410e5450) 04-21 23:30:25.621 22991-23227/com.example.android.sample.posto E/AndroidRuntime: FATAL EXCEPTION: other java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. if(cb.moveToFirst()) {があるのに、なぜかわからないのですが、このようなエラーがでました。
edoooooo

2017/04/21 14:49

V/yobaretaの数は:: 1 と出力されています。
edoooooo

2017/04/21 15:57

if(cb.moveToFirst()) {} if(cb.moveToFirst()) { String cccc = cb.getString(cb.getColumnIndex(Databaseset.Users.COL_CONTENT)); で解決しました。ありがとうございました。 データベースの勉強は不足しているところがあると思うので、まず、データベースの中身の確認をできるようにしようと思います。 ありがとうございました。
guest

0

リファレンスを読んでメソッドが何を返却するかを確認してください。

投稿2017/04/21 13:26

yona

総合スコア18155

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

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

edoooooo

2017/04/21 13:32

わかりました。ありがとうございます。
edoooooo

2017/04/21 14:17

カーソルがからの場合はfalseを返すと書いてありました。
swordone

2017/04/21 14:38

それから考えられることは何でしょう?falseが返ってきていることは確定なので、 cが指すカーソルが空であることが確定します。それはつまり、 Cursor c = db.rawQuery(sql, null); の問い合わせ結果が空という事実にほかなりません。 後はその原因を調べることになります。
yona

2017/04/21 14:52

あなたの考え方をテキスト化しますね。 疑問1:moveToFirstが必ずfalseになってしまう。 アドバイス1:リファレンスを読みましょう。 調査1:リファレンスでmoveToFirstが空の場合にはfalseになる。 ここまでがあなたの考えです。アドバイスをもらって調査1でリファレンスを読んで終わってしまっていますよね。 一般的な人なら次の疑問が出るはずです。それがあなたには無いようです。 疑問2:毎回検索結果が空になってしまう。
edoooooo

2017/04/21 14:52

複数のスレッドからのカーソルを使用するコードは、Cursorを使用するときに独自の同期を実行する必要があります。 とリファレンスに書いてあるのですが、このような原因でしょうか?
yona

2017/04/21 14:55

あなたの実力では辞めた方がいいですよ。 ゴミの上にゴミを実装しても無駄です。 そもそもスレッドを使っていない状態で成功しているんですか?
edoooooo

2017/04/21 15:17

使っていますが、 HandlerThread handlerThread = new HandlerThread("other"); handlerThread.start(); このように 別のスレッドをstartしているので、 リファレンスでいう独自の動機を実行する必要がある。 ということが必要だと思いました。
swordone

2017/04/21 15:19

また会話成立してねえ 「スレッドを使わずに成功しているのか」と聞いているのに 「(スレッドを)使っている」という返答は異常でしょう。
edoooooo

2017/04/21 15:24 編集

スレッドを使わないで成功することはできないと思ったので、 このように回答しました。
swordone

2017/04/21 15:34 編集

ここでいう「成功」は、「moveToFirstがtrueになる」ことですよ。 さらに言えば、「データベースからデータを取得できる」ということになりますか。
edoooooo

2017/04/21 15:38

はい、ありがとうございます。
edoooooo

2017/04/21 15:58

if(cb.moveToFirst()) {} if(cb.moveToFirst()) { String cccc = cb.getString(cb.getColumnIndex(Databaseset.Users.COL_CONTENT)); で解決しました。ありがとうございます。
yona

2017/04/21 17:13

このアプリはなんのために作っているんですか?
edoooooo

2017/04/21 17:19

一定時間(10時間)後とかに通知の来る日記(見ようとしても通知でしか見れない)があったら、日記を書くことをためらわず、過去の日記も楽しめるかと思って作りました。
yona

2017/04/21 17:26

そうですか、なら時間をかけて作ればいいと思いますよ。数年すればできると思います。
swordone

2017/04/21 17:28

素人にいきなり車は作れません。 まずは構成要素の各パーツを動かせるようにしてください。
edoooooo

2017/04/21 17:34

数年とは、このような回答をしているからということですよね。 今回はデータベースから取得したデータの表示方法についての知識が足りないことが生じさせたので、そこを理解しようと思います。
swordone

2017/04/21 17:36 編集

表示方法以前に、そもそもデータベース、もしくはプログラムそのものに関する知識が足りなさすぎる でなきゃ過去の質問で私やyonaさんとあんな堂々巡りの会話にならない
edoooooo

2017/04/21 17:42

わかりました。いろんな記事を読んで、基礎の知識をつけるように努力します。 この質問なのですが、アプリが完成したと思って、データベース名を変更したところ、if文の中に入れなくなりました。慌てて戻したところ、if文の中に入ることができました。 この問題は、基礎知識が足りないことによることなのでしょうか?すみません。
swordone

2017/04/21 17:48

足りないですね。普通に考えたら当たり前だろと思うのですが。
yona

2017/04/21 17:50

国語を勉強してください。 あなたは回答の意味を半分も理解していない節があります。 この状態で書籍を読もうが、記事を読もうが半分の理解しか出来ません。 また、コードを書くには半分の理解では意味がありません。
edoooooo

2017/04/21 18:03 編集

人の言ってることを、理解するために、意図を意識しようと思います。 すみませんでした。
swordone

2017/04/21 18:16

意図を理解というか、「言われたことそのまま」すら理解できていないのが問題。 だから「テキストファイルの中身」と聞いているのにMapがどうとか、 「データベースのカラム名」と聞いているのにデータの型をあげたりとか、 わけのわからない情報を出して回答者を混乱させてる
edoooooo

2017/04/21 18:29

はい、言われてることへの返しとして正しいかを考えて発言します。
guest

0

c.moveToFirst()の結果って何になってますか?

投稿2017/04/21 14:04

toutou

総合スコア2050

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

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

edoooooo

2017/04/21 14:07

どこに結果が出るのかがわからない状況です。
edoooooo

2017/04/21 14:09

エラーメッセージはでてないです
toutou

2017/04/21 14:12

最低限結果はtureではないです。わからないとデバックは出来ないはずなので今までどうやって確かめてきたのかが不思議です。結果を確認してください。
edoooooo

2017/04/21 14:16 編集

c.moveToFirst()の中と外にLog.v()を出力して、 c.moveToFirst()の中では表示でき、外では、表示できませんでした。 falseということしか結果はわかりません。
toutou

2017/04/21 14:19

if(false){}この処理が通らないのはわかります?それが答えだと思うんですが。
edoooooo

2017/04/21 14:21

わかります。 なぜfalseになるのかという、結果がメッセージとして出ているのかと誤解していました。
toutou

2017/04/21 14:24

if(c.moveToFirst()) { この中に入れません。という質問ですよね?で、c.moveToFirst()はfalseだと言うことですね。
edoooooo

2017/04/21 14:27

そうでした。なぜ、falsになるのかが、わからないため、質問内容を訂正します。
guest

0

ifの判定が常にfalseということなので、この原因を追っていくことになります。

投稿2017/04/21 13:21

HogeAnimalLover

総合スコア4830

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

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

edoooooo

2017/04/21 13:26 編集

while (c.moveToNext()) {でも、入れないのですが、原因は同じなのでしょうか?
HogeAnimalLover

2017/04/21 13:29

それはそうでしょう。判定する条件が同じなので。
HogeAnimalLover

2017/04/21 13:31

「c.moveToNext()の結果が常にfalseである」ことについて調べないと意味ないです。ifで入れないならばwhileであっても入れないです。
edoooooo

2017/04/21 13:32

ありがとうございます。調べてみます。
guest

0

自己解決

if(c.moveToFirst()) {}
if(c.moveToFirst()) {
String cccc = c.getString(c.getColumnIndex(Databaseset.Users.COL_CONTENT));

とすることで解決しました。

午前2:21分
解決していませんでした。
データベースを変えたところ、また、ifのなかに入れなくなりました。

投稿2017/04/21 15:58

編集2017/04/21 17:22
edoooooo

総合スコア476

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

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

swordone

2017/04/21 16:01

いきなりわけわからんcbとかいう変数出されて解決とか言われて納得いくか
edoooooo

2017/04/21 16:03

Cursor c   を Cursor cbとしただけですので、内容は変わりません。 cbとしたことで解決したとの誤解を招く文でした、すみません。
edoooooo

2017/04/21 16:04

編集します。
swordone

2017/04/21 16:05

なんかその場しのぎというか、根本の解決になっていないようにしか見えない
edoooooo

2017/04/21 16:18

確かに、昨日作った別のアプリですと、 if(c.moveToFirst()) { String cccc = c.getString(c.getColumnIndex(Databaseset.Users.COL_CONTENT)); でccccを取得できていました。 そのコードをみながら、今回のコードを書いたのですが、確かに理由はわかっていません。 moveToFirstを2度することでなぜ解決したのかは、 『moveToFirst()メソッドを使用し、確実にcursor内のデータ参照先を先頭に持ってくる。』 とサイトにかいてあることからは、わかりませんでした。moveToFirst()の仕組みを理解しようとリファレンスを読んでいるのですが、書いてないので、いろいろ検索してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問