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

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

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

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

Java

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

Android

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

Q&A

解決済

1回答

2092閲覧

Cursorの c.getString()をしたいのですが、where(mov)がfalseになります。sql文が間違えているのでしょうか?

edoooooo

総合スコア476

SQLite

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

Java

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

Android

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

0グッド

0クリップ

投稿2017/04/28 02:09

編集2017/04/28 10:54

このようなcreatetable、insert、selectを行っているのですが、
selectした後にc.getStringしたいのですがwhere(mov)がfalseで中に入れません。
この下のコードは、sqlをlogcatで出力したものになります。
なぜ、データを取得できないのでしょうか?

sql文が間違えているのでしょうか?

13:19 sqlの問題は、h2databaseで、sql文が正しいかを確認したことで、解消しました。

//create tableをしてる、MyOpenHelperクラス

java

1//create table 2 public static final String CREATE_TABLE = 3 "create table near (data text,username text,comment text,id integer primary key," + 4 "latitude double,longitude double)"; 5 6///////改善したcreatetable//////////// 7create table nearsdb (data text,username text,comment text,latitude double,longitude double); 8

//insertの文と、下は、logから取得したsql文です。LocationActivity

java

1//insertの文 2String sql="insert into near (data,username,comment,latitude,longitude)" + 3 " values ('"+data+"','"+username+"','"+comment+"',"+latitude+","+longitude+");"; 4 5//insertのsqlをlogで出力 6 insert into near (data,username,comment,latitude,longitude) 7 values ('4/ 28 10:33: 27','tai','やにやゆさはゆゆら',35.6539782,139.6471526) 8 9///////////改善したinsert文//////////////// 10insert into nearsdb(data,username,comment,latitude,longitude) values ('4/ 28 1:4: 7','ta','にのやはさは',35.6539782,139.6471526);

//select文と、下は、logから取得したsqlです。LocationActivity

java

1//select文 2 String sql= "select data,username,comment from near " + 3 "where latitude - "+latitude+" <= "+clearlatitude+" and " 4 +latitude+" - latitude <= "+clearlatitude+ 5 " and longitude - "+longitude+" <= "+clearlongitude+" and " 6 +longitude+" - longitude <= "+clearlongitude+";"; 7 8 9//selectのsqlをlogで出力 10 String sql= "select data,username,comment from near " + 11 "where latitude - 35.6539782 <= 2.694944E-5 " + 12 "and 35.6539782 - latitude <= 2.694944E-5 " + 13 "and longitude - 139.6471526 <= 3.2899147E-4" + 14 " and 139.6471526 - longitude <= 3.2899147E-4"; 15 16 Cursor c = db.rawQuery(sql, null); 17 boolean mov = c.moveToFirst(); 18while (mov) { 19 20Log.v("whileにはいった",sql); 21textView.setText(String.format("%s %s : %s", c.getString(0), c.getString(1),c.getString(2))); 22 } 23 24///////////////改善したselect文//////////// 25select data,username,comment from nearsdb where latitude - 35.6539782 <= 2.694944E-5 and 35.6539782 - latitude <= 2.694944E-5 and longitude - 139.6471526 <= 3.2899147E-4 and 139.6471526 - longitude <= 3.2899147E-4; 26

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

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

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

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

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

swordone

2017/04/28 02:36

これを普通にコードとして書いていたらinsertのあたりでコンパイルエラーになりません?こんな書き方されたらこちらとしてはどういう意味か全く分かりません。insertのあたりは何を意味するのでしょう?
edoooooo

2017/04/28 02:39

sqlをlogcatで出力したものになります。 そうすることで、値の中身が表示されるので、そのようにしました。普通のinsert文も追記しました。
yona

2017/04/28 02:41

1つのコード記法の中に書かずに別のコードとして分けてください。
swordone

2017/04/28 02:44

そもそも最初のpublic static finalと書いている部分はクラスメンバのはずなのでメソッド外にあるはずですが、そのあとに続けてwhileとか書けませんよ?そのせいでこのコードが一体どういう流れで使われるものなのかが全く分かりません。
edoooooo

2017/04/28 02:52

それぞれのクラスや、コードの説明を加えました。 public static final の create tableは、下のinsertとselectとは、別クラスです。
guest

回答1

0

ベストアンサー

where句の条件が間違っているからじゃないですか、一度where句を削除して実行してください。

以前にmoveToFirstがfalseなのはデータが取れていないからと回答したと思いますが、忘れてしまったんですか?
質問するならなぜ取れないのかを聞くべきです。

投稿2017/04/28 02:26

yona

総合スコア18155

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

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

edoooooo

2017/04/28 02:37

where句を削除して行いましたが、whereで、出力されるはずのLogは、出力されませんでした。
yona

2017/04/28 02:40

「whereで出力されるはずのLog」とはなんですか?他人にもわかるように説明してください。
edoooooo

2017/04/28 02:41

Log.v("whileにはいった",sql);のことです。遅れました。
yona

2017/04/28 02:42

ではnearテーブルにデータが無いとは考えないんですか?
swordone

2017/04/28 02:54

"SELECT * FROM near"(SQL自信ないんでこれでいいのか…)で一回全件とってみるとかすればいいのに
edoooooo

2017/04/28 03:00

whereが複雑だったので、"select * from near;"などの簡潔にしたsql文では、確かめていたのですが、 取得はできませんでした
edoooooo

2017/04/28 03:02

nearテーブルにデータがないと考えていました。 insert文が間違えていないと思っていたので、テーブルや、Cursorの使い方などに問題があるのではと思っていました。
yona

2017/04/28 03:03

insert文が間違えていないとはどうやって確認したんですか?
edoooooo

2017/04/28 03:04

selectして、データが取得できるかなどは、 ターミナルから操作ができないので、できません。 そのため、構文が正しいかを、いろんなサイトを見て判断しました。
yona

2017/04/28 03:08

ターミナルから操作が出来るように解決するのが先では無いですか? それができないとしても、SQL文が正しいかどうかはPC上にデータベースとテーブルを作り、質問にあるSQL文を実行したらわかりますよね。
edoooooo

2017/04/28 03:41

H2databaseで、 create table address(id integer primary key, name text); insert into address(name) values('安藤'); とのようにサイトをコピペしたところ、 列 "ID" にはnull値が許されていません NULL not allowed for column "ID"; SQL statement: insert into address(name) values('安藤') このようにエラーが出て、どうも、integer primary keyを使わないとエラーが出ないので、バージョン的に使えなくでもなったのでしょうか?
yona

2017/04/28 03:48

それはSQLの基本や仕様を確認した上で言っているんでしょうか。 オートインクリメントについて調べてください。
edoooooo

2017/04/28 03:52

はい、ありがとうございます。 調べて、h2databaseで試してみます。
edoooooo

2017/04/28 04:16

AUTOINCREMENTの目的は、以前に削除された行からROWIDを再利用しないようにすることです。 とのことでした。idをコードで使わなくても、作りたいアプリが実現できたので、 create table nearsdb (data text,username text,comment text,latitude double,longitude double); insert into nearsdb(data,username,comment,latitude,longitude) values ('4/ 28 1:4: 7','taichi','にのやはさは',35.6539782,139.6471526); select data,username,comment from nearsdb where latitude - 35.6539782 <= 2.694944E-5 and 35.6539782 - latitude <= 2.694944E-5 and longitude - 139.6471526 <= 3.2899147E-4 and 139.6471526 - longitude <= 3.2899147E-4; で、h2databaseないで、しっかり出力することができました。 しかし、AndroidStudioで実行しても、whileのなかには、入れませんでした。 以前、Cursorの位置を取得したら、moveToFirst()を2度行って、やっと取得できる位置にCursorが移動したということがありました。 その時のようにCursorの位置を調べて、どのような場所にCursorがあるかをもう一度、調べてみます。 SQL文や、createtableにいろんなエラーがありましたが、それらは、改善したことを確認できました。
yona

2017/04/28 04:26 編集

アプリをアンインストールしてから実行しましたか? また、where区の中が指数表示になっているのは問題ないんですか?
edoooooo

2017/04/28 04:47

clean project 、rebuild、pcの再起動、appのアンインストールをして、 実行しました。 where句の件は、h2databaseでは、大丈夫だったという情報しかありません。 while()のなかのLogは、出力できませんでした。先ほどコメントしたことをやってみます。 ありがとうございます。
yona

2017/04/28 04:51

h2databaseは知りませんでしたが、 h2databaseとSQLiteは別のSQL実装ですよね? これで確認する意味がわかりません。
edoooooo

2017/04/28 05:13

結果が変わってくるんですね。 過去に使ってたのと、webで使えたので選んでしまいました。 sqliteについて調べます。
edoooooo

2017/04/28 05:17

以前、sqliteをターミナルから操作するための作業がとても複雑で、無理やり使えるようにする手段のように感じたのですが、メジャーな方法なんてあるのでしょうか?
yona

2017/04/28 05:21

調べて先頭に来るのがメジャーな方法です。 私はプログラムを書いて直接見ますがあなたはやらない方がいいです。
edoooooo

2017/04/28 05:58

はい、プログラムを書いて直接見るのは、構文のエラーを見つけられそうもないので、検索してターミナルから使えるようにします。
edoooooo

2017/04/28 11:02

h2databaseを使用するのとsqliteを使用するのでは、結果が異なるとのことでしたが、 String sql = "insert into neardb(data,username,comment,latitude,longitude)" + " values ('" + data + "','" + username + "','" + comment + "'," + latitude + "," + longitude + ");"; String sql = "select * from neardb ;"; のコードのように簡単なものとしても、データを取得できませんでした。 そして、if(c!=null){ Log.d("cはnullではなかった","しかしその次のwhileでは入れなかった"); while(c.moveToNext()){ } } との結果が出たため、nullではないということから、質問でコードを記載したいのですが、こちらの質問は、sqlの問題に重点をおいた質問でしたので、解決とさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問