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

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

ただいまの
回答率

90.34%

  • Android

    6728questions

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

  • データベース

    734questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

  • SQLite

    665questions

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

  • 検索

    95questions

    検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Android SQLite AND検索について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 638

sanou123

score 2

AndroidStudioでアプリ開発を行っています。以下のようなプログラム(search.java、search1.java、search2.javaの3つのプログラムを使用。下のプログラムの/**/の部分が違うだけ。)でデータベースに格納したものを表示させたいのですが、AND検索がうまく行っていません。具体的に説明すると一回目のデータ表示はうまくいきます。ただ、新たにデータを格納すると一回目のデータが表示されてしまいます。
漠然として非常にわかりにくい説明だと思いますが回答お願いします。

  // 検索を始める時
    private void init() {

        dbAdapter.readDB();                         // DBの読み込み(読み込みの方)

        TableRow rowHeader = new TableRow(this);    // 行を作成
        rowHeader.setPadding(16, 12, 16, 12);       // 行のパディングを指定(左, 上, 右, 下)

        // ヘッダー:日時
        TextView headerDate = setTextItem("日時", GCH);            // TextViewのカスタマイズ処理
        TableRow.LayoutParams paramsDate = setParams(0.4f);       // LayoutParamsのカスタマイズ処理
        // ヘッダー:最大心拍数
        TextView headerHeart_rate = setTextItem("最大心拍数", GCH);
        TableRow.LayoutParams paramsHeart_rate = setParams(0.4f);
        // ヘッダー:消費カロリー
        TextView headerCalorie_consumption = setTextItem("消費カロリー", GCH);
        TableRow.LayoutParams paramsCalorie_consumption = setParams(0.3f);
        // ヘッダー:総走行時間
        TextView headerTotal_time = setTextItem("残り時間", GCH);
        TableRow.LayoutParams paramsTotal_time = setParams(0.4f);
        // ヘッダー:総走行距離
        TextView headerTotal_distance = setTextItem("走行距離", GCH);
        TableRow.LayoutParams paramsTotal_distance = setParams(0.3f);
        // ヘッダー:コース名
        TextView headerCourse = setTextItem("コース名", GCH);
        TableRow.LayoutParams paramsCourse = setParams(0.3f);
        // rowHeaderにヘッダータイトルを追加
        rowHeader.addView(headerDate, paramsDate);          // ヘッダー:日時
        rowHeader.addView(headerHeart_rate, paramsHeart_rate);          // ヘッダー:最大心拍数
        rowHeader.addView(headerCalorie_consumption, paramsCalorie_consumption);          // ヘッダー:消費カロリー
        rowHeader.addView(headerTotal_time, paramsTotal_time);          // ヘッダー:総走行距離
        rowHeader.addView(headerTotal_distance, paramsTotal_distance);            // ヘッダー:総走行時間
        rowHeader.addView(headerCourse, paramsCourse);          // ヘッダー:コース名

        rowHeader.setBackgroundResource(R.drawable.row_deco1);  // 背景

        // TableLayoutにrowHeaderを追加
        mTableLayout03List.addView(rowHeader);

/********************************search.java***************************************************/
        String column = "name_id";
        String column1 = "training_name";          //検索対象のカラム名
        String[] name_id = {globals.name_id};
        String [] training_name = {"TimeAttack"};            //検索対象の文字

        // DBの検索データを取得 入力した文字列を参照してDBのデータから検索
        Cursor c = dbAdapter.searchDB(null, column , name_id);
        Cursor c1 = dbAdapter.searchDB(null, column1,training_name);
/*********************************************************************************************/

/********************************search1.java***************************************************/
        String column = "name_id";
        String column1 = "training_name";          //検索対象のカラム名
        String[] name_id = {globals.name_id};
        String [] training_name = {"TimeAttack"};            //検索対象の文字

        // DBの検索データを取得 入力した文字列を参照してDBのデータから検索
        Cursor c = dbAdapter.searchDB(null, column , name_id);
        Cursor c1 = dbAdapter.searchDB(null, column1,training_name);
/*********************************************************************************************/

/********************************search2.java***************************************************/
        String column = "name_id";
        String column1 = "training_name";          //検索対象のカラム名
        String[] name_id = {globals.name_id};
        String [] training_name = {"TimeAttack"};            //検索対象の文字

        // DBの検索データを取得 入力した文字列を参照してDBのデータから検索
        Cursor c = dbAdapter.searchDB(null, column , name_id);
        Cursor c1 = dbAdapter.searchDB(null, column1,training_name);
/*********************************************************************************************/

        if (c.moveToFirst() && c1.moveToFirst()) {
            do {

                TableRow row = new TableRow(this);          // 行を作成
                row.setPadding(16, 12, 16, 12);             // 行のパディングを指定(左, 上, 右, 下)

                // 日時
                TextView textDate = setTextItem(c.getString(3)+c.getString(4)+c.getString(5)+'\n'
                        +c.getString(6), GCH);     // TextViewのカスタマイズ処理
                // 最大心拍数
                TextView textHeart_rate = setTextItem(c.getString(7)+" [bpm]", GCH);     // TextViewのカスタマイズ処理
                // 消費カロリー
                TextView textCalorie_consumption = setTextItem(c.getString(8)+" [cal]", GCH);      // TextViewのカスタマイズ処理
                // 総走行時間
                TextView textTotal_time = setTextItem(c.getString(9), GCH);      // TextViewのカスタマイズ処理
                // 総走行距離
                TextView textTotal_distance = setTextItem(c.getString(15)+" [km]", GCH);      // TextViewのカスタマイズ処理
                // コース名
                TextView textCourse = setTextItem(c.getString(11), GCH);      // TextViewのカスタマイズ処理


                // rowHeaderに各項目(DBから取得した各項目)を追加
                row.addView(textDate, paramsDate);      // 日時
                row.addView(textHeart_rate, paramsHeart_rate);      // 最大心拍数
                row.addView(textCalorie_consumption, paramsCalorie_consumption);      // 消費カロリー
                row.addView(textTotal_time, paramsTotal_time);      // 総走行時間
                row.addView(textTotal_distance, paramsTotal_distance);        // 総走行距離
                row.addView(textCourse, paramsCourse);          // コース名

                mTableLayout03List.addView(row);            // TableLayoutにrowHeaderを追加

                // 交互に行の背景を変える
                if (colorFlg % 2 != 0) {
                    row.setBackgroundResource(R.drawable.row_deco2);
                } else {
                    row.setBackgroundResource(R.drawable.row_deco1);
                }
                colorFlg++;

            } while (c.moveToNext() && c1.moveToNext());
        } else {
            Toast.makeText(this, "登録されているデータがありません。", Toast.LENGTH_SHORT).show();
        }
        c.close();
        dbAdapter.closeDB();        // DBを閉じる

    }

/*searchDB*/
/*************************************************************************************************/
*public Cursor searchDB(String[] columns, String column, String[] name) {
*        return db.query(DB_TABLE_DATA, columns, column + " like ?", name, null, null, null);
*    }
/*************************************************************************************************/
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yona

    2017/02/07 17:34

    コードはコード用の記述に修正してください。

    キャンセル

回答 1

checkベストアンサー

0

カーソルのカウント数が増えているかを確認しましょう。
また、2つのカーソルを使っている意味はなんでしょうか?
ファイルが異なるならコードは分割してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/09 14:36

    当初カーソルをひとまとめにしようとしたのですが条件文の書き方がいまいちわからず、2つに分けてみました。
    以下のように考えていました。

    String column = "name_id";
    String column1 = "training_name"; //検索対象のカラム名
    String[] name_id = {globals.name_id};
    String [] training_name = {"Normal"}; //検索対象の文字

    // DBの検索データを取得 入力した文字列を参照してDBの品名から検索
    Cursor c = dbAdapter.searchDB(null, column + "AND" + column1, name_id +"OR"+ training_name);

    キャンセル

  • 2017/02/09 14:58

    データベースは順番を保証しないと思いますよ。また、あなたの作ったsearchDBについては知りません。

    queryメソッドで下記のようにすればいいと思いますよ。
    query(DB_TABLE_DATA, columns, "hoge like ? or hogehoge like ?", new String[]{"hoge","hoge"}, null, null, null);

    また、カーソルの行数を調べてください。

    キャンセル

  • 2017/02/10 00:57

    queryメソッドを書き換えたところ動作しました。ありがとうございます!

    キャンセル

同じタグがついた質問を見る

  • Android

    6728questions

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

  • データベース

    734questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

  • SQLite

    665questions

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

  • 検索

    95questions

    検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。