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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

5995閲覧

rawQueryで同じ引数の場合、selectionArgsに値を入れる時は同じものをいくつも入れる必要があるんでしょうか?

SmartBuzz

総合スコア81

Android

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/10/27 11:48

編集2016/10/28 01:42

java

1 SQLiteDatabase db = databaseHelper.getReadableDatabase(); 2 3 String sql = "SELECT m.*, count(l.collection_id) " + 4 "FROM collection AS m " + 5 "LEFT JOIN log AS l ON m._id=l.collection_id " + 6 "WHERE m.name1 LIKE '%" + "?" + "%' OR " + 7 "m.name2 LIKE '%" + "?" + "%' OR " + 8 "m.ruby1 LIKE '%" + "?" + "%' OR " + 9 "m.ruby2 LIKE '%" + "?" + "%' OR " + 10 "m.english LIKE '%" + "?" + "%' OR " + 11 "m.address LIKE '%" + "?" + "%' " + 12 "GROUP BY m._id;"; 13 14 String[] selectionArgs = {query,query,query,query,query,query}; 15 16 Cursor cursor = db.rawQuery(sql, selectionArgs);

今回このようなコードを書きました。
?のところは全て同じquery変数が入ります。

その時に、selectionArgsには?の数だけ変数を入れる必要があるのでしょうか?

また、今回

java

1 SQLiteDatabase db = databaseHelper.getReadableDatabase(); 2 3 String sql = "SELECT m.*, count(l.collection_id) " + 4 "FROM collection AS m " + 5 "LEFT JOIN log AS l ON m._id=l.collection_id " + 6 "WHERE m.name1 LIKE '%" + query + "%' OR " + 7 "m.name2 LIKE '%" + query + "%' OR " + 8 "m.ruby1 LIKE '%" + query + "%' OR " + 9 "m.ruby2 LIKE '%" + query + "%' OR " + 10 "m.english LIKE '%" + query + "%' OR " + 11 "m.address LIKE '%" + query + "%' " + 12 "GROUP BY m._id;"; 13 14 String[] selectionArgs = {query,query,query,query,query,query}; 15 16 Cursor cursor = db.rawQuery(sql, selectionArgs);

このコードを改造して初めに書いたコードになりました。
2つ目はうまく動いていたのに、rawQueryの中で「fatal exception thread-18104」というエラーで落ちるようになてつぃまいました。

selectionArgsの引数の数

指摘後修正したコード

java

1 String sql = "SELECT m.*, count(l.collection_id) " + 2 "FROM collection AS m " + 3 "LEFT JOIN log AS l ON m._id=l.collection_id " + 4 "WHERE m.name1 LIKE '%" + "?" + "%' OR " + 5 "m.name2 LIKE '%" + "?" + "%' OR " + 6 "m.ruby1 LIKE '%" + "?" + "%' OR " + 7 "m.ruby2 LIKE '%" + "?" + "%' OR " + 8 "m.english LIKE '%" + "?" + "%' OR " + 9 "m.address LIKE '%" + "?" + "%' " + 10 "GROUP BY m._id;"; 11 12 String[] selectionArgs = new String[6]; 13 14 for(int i= 0;i<selectionArgs.length;i++){ 15 selectionArgs[i] = new String(query); 16 } 17 18 Cursor cursor = db.rawQuery(sql, selectionArgs);

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

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

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

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

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

guest

回答2

0

自己解決

sqlの方で
LIKE "'%?%'"ではなく
sqlは
LIKE ? OR
として、
new String("%" + query + "%")として解決した。

投稿2016/10/28 11:37

SmartBuzz

総合スコア81

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

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

0

?とselectionArgsの数は一致しないといけません。
1つ目は同じ値をいれるだけでも?の数と同じ要素数の配列を用意しなければいけません。
また、2つ目は?が0に対して、配列の要素数が多すぎるためエラーになります。

投稿2016/10/27 12:24

yona

総合スコア18155

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

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

SmartBuzz

2016/10/28 06:06 編集

String sql = "SELECT m.*, count(l.mountain_id) " + "FROM mountain AS m " + "LEFT JOIN log AS l ON m._id=l.mountain_id " + "WHERE m.name1 LIKE '%?%' OR " + "m.name2 LIKE '%?%' OR " + "m.ruby1 LIKE '%?%' OR " + "m.ruby2 LIKE '%?%' OR " + "m.english LIKE '%?%' OR " + "m.address LIKE '%?%' " + "GROUP BY m._id;"; String[] selectionArgs = new String[6]; for(int i= 0;i<selectionArgs.length;i++){ selectionArgs[i] = new String(query); } Cursor cursor = db.rawQuery(sql, selectionArgs); としても、エクセプションが発生しています…。
yona

2016/10/28 10:48

エクセプションが発生しますではわかりません。エラーメッセージを書いてください。
SmartBuzz

2016/10/28 11:30

すいません。 --------- beginning of crash 10-28 20:28:08.060 3181-3364/com.collector.alpha E/AndroidRuntime: FATAL EXCEPTION: Thread-23 Process: com.collector.alpha, PID: 3181 java.lang.IllegalArgumentException: Cannot bind argument at index 6 because the index is out of range. The statement has 0 parameters. at android.database.sqlite.SQLiteProgram.bind(SQLiteProgram.java:212) at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:166) at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200) at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47) at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1318) at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1257) at com.collector.CollectorDatabase.getList(CollectorDatabase.java:425) at com.collector.activity.ListActivity$5.run(ListActivity.java:302) at java.lang.Thread.run(Thread.java:761) 10-28 20:28:11.240 3181-3995/com.collector.alpha I/GMPM: Tag Manager is not found and thus will not be used このようなメッセージです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問