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

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

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

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

Java

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

Android

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

Q&A

解決済

1回答

1839閲覧

Android sqlite文字一致分岐について

toyopi_kouchan

総合スコア12

SQLite

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

Java

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

Android

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

0グッド

0クリップ

投稿2016/01/27 11:25

編集2016/01/27 12:05

Android sqliteを利用してデータベースの特定のデータで分岐して表示しようと考えています。
sqliteのデータを取り、データの文字一致の分岐を記述して特定のtext viewにset textをし、表示させるプログラムです。
特定のtextviewは、DesplayRERURNTRANCEJP、DesplayRERURNTRANCEOTHERの2つ用意しており、分岐が一致したら、DesplayRERURNTRANCEJP のtext viewにデータを入れて表示させ、 DesplayRERURNTRANCEOTHER のtext viewに改行だけを入れて表示させるプログラムです。
一致しなかったら、DesplayRERURNTRANCEOTHER のtext viewにデータを入れて表示させ、DesplayRERURNTRANCEJP のtext viewに改行を入れるプログラムです。
しかし、すべてのデータが片方のtext viewに表示されてしまいます。
一つ一つのデータを分岐をかけて、一つ一つ表示をしたいです。

ソースは以下になります。

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import static android.provider.BaseColumns._ID;
import static jp.go.nict.slc.sdk.sample.SQ_lite.LANGUAGE;
import static jp.go.nict.slc.sdk.sample.SQ_lite.RERUTN_TRANCERATE;
import static jp.go.nict.slc.sdk.sample.SQ_lite.TABLE_NAME;
import static jp.go.nict.slc.sdk.sample.SQ_lite.TIME;

public class kiyaku extends Activity {

private static String TAG = "showlog"; private TextView DesplayRERURNTRANCEJP; private TextView DesplayRERURNTRANCEOTHER; private DBO_Helper helper; private static String[] FROM = { _ID, RERUTN_TRANCERATE,LANGUAGE,TIME}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.seiyaku); helper = new DBO_Helper(this); // テキストビューのセット DesplayRERURNTRANCEJP = (TextView) findViewById(R.id.display_log_left); DesplayRERURNTRANCEOTHER = (TextView) findViewById(R.id.display_log_right); // ⑤以下は実行するメソッド Cursor cursor = getData(); showRETURN(cursor); // ⑥データベースを閉じる helper.close(); } // ③データベースから入力したデータの読み込み private Cursor getData() { SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db .query(TABLE_NAME, FROM, null, null, null, null, null); startManagingCursor(cursor); return cursor; } // ④データベースから読み込んだデータを取得します. // テキストビューを上書きして表示する private void showRETURN(Cursor cursor) { // テキストデータを組み立てるためにStringBuilderをセット StringBuilder builder = new StringBuilder("\n"); StringBuilder builderleft = new StringBuilder("\n"); while (cursor.moveToNext()) { // 各列ごとにデータを取得する

//LANGUAGEをすべて取り出している
String language = cursor.getString(2);

//sqliteデータのlanguageでenが一致したら DesplayRERURNTRANCEJP にデータを入れて表示、
// DesplayRERURNTRANCEOTHER は改行のみ

if (language.equals("en") ) { String trancelate = cursor.getString(1); String time = cursor.getString(3); builder.append(trancelate).append(" "); builder.append(time).append("\n"); DesplayRERURNTRANCEJP.setText(builder); builderleft.append("\n"); DesplayRERURNTRANCEOTHER.setText(builderleft); }

//sqliteデータのlanguageが一致しなかったら、 DesplayRERURNTRANCEOTHER にデータを入れて表示、
// DesplayRERURNTRANCEJP は改行のみ
else{
String trancelate = cursor.getString(1);

String time = cursor.getString(3); builder.append(trancelate).append(" "); builder.append(time).append("\n"); DesplayRERURNTRANCEOTHER.setText(builder); builderleft.append("\n"); DesplayRERURNTRANCEJP.setText(builderleft); } } } }

sqliteのデータベースにはこのデータが格納されています。

ID RETURNTRANCELATE LANGUAGE TIME

1 あ jp 1

2 i en 2

3 u tyu 3

4 え jp 4

5 お jp 5

そして目標の実現したい表示はこうです。

※text view区切りの|を入れています。

DesplayRERURNTRANCEJP |DesplayRERURNTRANCEOTHER

あ 1 | 改行 改行 | i 2 改行 | u 3 え 4 | 改行 お 5 | 改行

しかし、問題はこのように表示してしまいます。

※text view区切りの|を入れています。

DesplayRERURNTRANCEJP |DesplayRERURNTRANCEOTHER

改行 | あ 1 改行 | i 2 改行 | u 3 改行 | e 4 改行 | お 5

どうすればいいでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

全部右に入るということは、条件分岐if (language.equals("en") ) がすべてfalseになっているということになります。デバッグでlanguageに入っている文字が何なのか一度確認してみてはいかがでしょうか。

また、希望の出力にするには比較対象は"en"ではなく"jp"では?


原因がわかりました。
trueの場合もfalseの場合も情報はすべてbuilderに、改行をbuilderleftに入れています。
つまり、分けているつもりが分けられていません。
StringBuilderがwhileの外にあるため、ループするたびにデータまたは改行が付け足され、
付け足された状態のStringBuilderでTextViewが上書きされます。
最終的に、最後の行のlanguageによる分岐の結果のみによって、データが入るTextViewが決定されています。
これを解消するためには、データを入れるbuilderを変える必要があります。
また、setTextは最後の1回で十分です。

java

1private void showRETURN(Cursor cursor) { 2 3 // テキストデータを組み立てるためにStringBuilderをセット 4 //DesplayRERURNTRANCEJPに表示する文字列ビルダーのAと、 5 //DesplayRERURNTRANCEOTHERに表示する文字列ビルダーのB 6 StringBuilder builderA = new StringBuilder("\n"); 7 StringBuilder builderB = new StringBuilder("\n"); 8 9 while (cursor.moveToNext()) { 10 11 String language = cursor.getString(2); 12 String translate = cursor.getString(1); 13 String time = cursor.getString(3); 14 15 //sqliteデータのlanguageでenが一致したらbuilderAにデータを追加 16 //builderBには改行のみ追加 17 18 if (language.equals("jp")) { 19 builderA.append(translate).append(" "); 20 builderA.append(time).append("\n"); 21 builderB.append("\n"); 22 } 23 24 //sqliteデータのlanguageが一致しなかったら、builderBにデータを追加 25 //builderAには改行のみ 追加 26 else{ 27 builderB.append(translate).append(" "); 28 builderB.append(time).append("\n"); 29 builderA.append("\n"); 30 } 31 32 } 33 //whileループを抜けてから、結果をTextViewにセット 34 DesplayRERURNTRANCEJP.setText(builderA); 35 DesplayRERURNTRANCEOTHER.setText(builderB); 36 37} 38 39

投稿2016/01/27 12:10

編集2016/01/27 12:37
swordone

総合スコア20651

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

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

toyopi_kouchan

2016/01/27 12:16 編集

回答ありがとうございます。 すみません、enではなく、jpでした。 jpにしたら、trueでかえされています。 しかし、すべてtrueで返されており、languageは jp en tyu jp jpが入っています。
toyopi_kouchan

2016/01/27 13:05

回答ありがとうございます! 無事できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問