android sqliteで謎の値が入出力されてしまう
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 432
前提・実現したいこと
現在android_studioで英単語帳アプリを作成しています。
英単語とその日本語訳をedit_textに入力したものをsqliteを使って保存し取り出したいです。
発生している問題・エラーメッセージ
edit_textから文字を取得してContent_valueに入れたものをdatabaseに追加していますが、
そのデータを取り出すときには値が変わっていてこのようなオブジェクト自体の情報? (例) android.support.v7.widget.AppCompatEditText{5c04aac VFED..CL. .F...... 0,496-
1032,992 #7f07004d app:id/japaneseword} のようなものになっています。
該当のソースコード
package com.example.englishwordnote;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class input_new_word extends AppCompatActivity {
SQLiteDatabase db;
sqlite_db sqlitehelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_input_new_word);
sqlitehelper =new sqlite_db((getApplicationContext()));
db= sqlitehelper.getWritableDatabase();
findViewById(R.id.enterbutton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText englishword=findViewById(R.id.englishword);
SpannableStringBuilder sb1 =(SpannableStringBuilder)englishword.getText();
String str1 =sb1.toString();
EditText japanseword=findViewById(R.id.japaneseword);
SpannableStringBuilder sb2 =(SpannableStringBuilder)japanseword.getText();
String str2 =japanseword.getText().toString();
sqlitehelper.saveDate(str1,str2);//データベースへの入力
String s =sqlitehelper.showdata(db); //;データベースからの返答
Log.v("show","取得した値は"+s+"です");
}
} );
}
}
package com.example.englishwordnote;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.ContentValues;
import android.content.Context;
import android.util.Log;
public class sqlite_db extends SQLiteOpenHelper {
private static final int DATABASE_VERSION =4;
private static final String DATABASE_NAME="TestDB.db";
private static final String TABLE_NAME="testtable";
private static final String SQL_CREATE_ENTRIES="CREATE TABLE "+TABLE_NAME + "("+"english String"+","+"japanese String"+")";
sqlite_db(Context context){
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db){
db.execSQL(SQL_CREATE_ENTRIES); // table作成
}
public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion){
onCreate(db);
}
public void saveDate(String english,String japanese){ //データの格納
SQLiteDatabase db =this.getWritableDatabase();
ContentValues values =new ContentValues();
values.put("english",english);
values.put("japanese",japanese);
Log.d("database", english+"と"+japanese+"を入力しました");
db.insert(TABLE_NAME,null,values);
}
public String showdata(SQLiteDatabase db){//データベースからquery結果をcursorで受け取る
String[] columns={"english","japanese"};
Cursor cursor =db.query(TABLE_NAME,columns,null,null,null,null,
null,null);
StringBuilder stringBuilder =new StringBuilder();
cursor.moveToFirst(); //先頭の行に移動
for(int i=cursor.getCount()-1;i<cursor.getCount();i++){//一番最後に入力した単語を取得
stringBuilder.append(cursor.getString(1));
cursor.moveToNext();
}
cursor.close();
String s =new String(stringBuilder);
return s;
}
}
試したこと
デバッグでデータベースにinsertするときのvalueを確認しましたが、そのときは正常な値で取り出すときには意図しない値になっていました。
補足情報(FW/ツールのバージョンなど)
androidstudio version 3.4
compile sdk version api28
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
自分の環境では、リード、ライトは正常でした。
以下は意図しない結果になるとおもいます。
for(int i=cursor.getCount()-1;i<cursor.getCount();i++){//一番最後に入力した単語を取得
stringBuilder.append(cursor.getString(1));
cursor.moveToNext();
}
DBの確認は、以下が便利ですよ
https://www.rozkey59.tokyo/entry/2018/06/18/231420
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
jimbe
2019/05/17 17:54
まず確認ですが, データベースには何件入っていますでしょうか?
showData 内の for ループは, 「一番最後に入力した単語を取得」とコメントされていますが, コメントと異なり, データベースに何件入っていても最初の 1 件しか読み込みません.
tomoti
2019/05/17 21:21
ご回答ありがとうございます。 問題は解決することができました。
ご指摘の通りforループ条件を間違えていたようで過去に入れた間違った情報を取得していたようです。
現在、ほかのコードは正常に動作していたようで、forループのみを修正して最新のデータを取得したとこ
正しく動作しました。 本当に助かりました。