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

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

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

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

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

962閲覧

【AndroidStudio】SQLiteから取得した数値が変換されて表示されてしまう

HW_

総合スコア18

SQLite

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

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1グッド

0クリップ

投稿2017/12/26 04:10

編集2017/12/26 08:03

###前提・実現したいこと
AndroidStudioで、EditTextに入力された文字をSQLiteに保存し、それを表示するということをしたいのですが、数値が正しく表示されてくれません。
一つ目の入力欄に10桁、二つ目に20桁を入力します。(以下の画像参照)
入力画面

SENDボタン押下でこれをSQLiteに保存し、SQLiteの中身を表示する画面に遷移するのですが、20桁の数字が変換されて表示されてしまいます。(以下の画像参照)
結果画面

###該当のソースコード
MainActivity

java

1public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 final EditText editText1 = (EditText)findViewById(R.id.editText1); 9 final EditText editText2 = (EditText)findViewById(R.id.editText2); 10 11 Button btn = (Button)findViewById(R.id.button); 12 btn.setOnClickListener(new View.OnClickListener() { 13 @Override 14 public void onClick(View v) { 15 MyOpenHelper helper = new MyOpenHelper(MainActivity.this); 16 SQLiteDatabase db = helper.getWritableDatabase(); 17 18 ContentValues values = new ContentValues(); 19 values.put("String_1", editText1.getText().toString()); 20 values.put("String_2", editText2.getText().toString()); 21 22 try { 23 db.insert("Test", null, values); 24 } finally { 25 db.close(); 26 } 27 28 Intent intent = new Intent(MainActivity.this, ResultActivity.class); 29 startActivity(intent); 30 finish(); 31 } 32 }); 33 34 Button btn1 = (Button)findViewById(R.id.button1); 35 btn1.setOnClickListener(new View.OnClickListener() { 36 @Override 37 public void onClick(View v) { 38 MyOpenHelper helper = new MyOpenHelper(MainActivity.this); 39 SQLiteDatabase db = helper.getWritableDatabase(); 40 helper.ResetButton(db); 41 } 42 }); 43 } 44} 45

ResultActivity(SQLiteの中身を表示する画面のアクティビティ)

java

1public class ResultActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_result); 7 8 LinearLayout linearLayout = (LinearLayout)findViewById(R.id.Linear); 9 10 String[] string_1 = new String[10]; 11 String[] string_2 = new String[10]; 12 13 MyOpenHelper helper = new MyOpenHelper(this); 14 SQLiteDatabase db = helper.getReadableDatabase(); 15 16 Cursor c = db.query("Test", 17 new String[]{"String_1", "String_2"}, 18 null, null, null, null, null); 19 20 boolean mov = c.moveToFirst(); 21 int i = 0; 22 while (mov) { 23 string_1[i] = c.getString(0); 24 string_2[i] = c.getString(1); 25 mov = c.moveToNext(); 26 i++; 27 } 28 c.close(); 29 db.close(); 30 31 TextView[] textViews = new TextView[i]; 32 String string_3; 33 for(int j = 0; j < i; j++) { 34 if (j >= 10) { 35 break; 36 } 37 string_3 = string_1[j] + " : " + string_2[j]; 38 textViews[j] = new TextView(this); 39 textViews[j].setText(string_3); 40 linearLayout.addView(textViews[j]); 41 } 42 } 43}

MyOpenHelper

java

1public class MyOpenHelper extends SQLiteOpenHelper { 2 public MyOpenHelper(Context context) { 3 super(context, "TestDB", null, 1); 4 } 5 6 @Override 7 public void onCreate(SQLiteDatabase db) { 8 9 db.execSQL("create table Test(" + "_id integer primary key autoincrement not null, " 10 + " String_1 String not null," + "String_2 String not null" + ");"); 11 } 12 13 @Override 14 public void onUpgrade(SQLiteDatabase db, int i, int i1) { 15 16 } 17 18 public void ResetButton (SQLiteDatabase db) { 19 db.execSQL("delete from Test"); 20 } 21}

###試したこと
Logで確認したところ、SQLiteに保存する前のEditTextに入力された値は正しく表示されましたが、SQLiteから取得した値は変換されて表示されました。
この原因は文字列の取得の仕方やSQLiteへの保存の仕方でしょうか?
わかる方がいらっしゃいましたら回答をお願いいたします。

###追記
数値として認識されているとのことなので、苦肉の策として記号をくっつけることで文字列として認識させる手段を取りました。
一応表面上は解決していますが、もっといい方法はないでしょうか。

格納部分

java

1String str = editText2.getText().toString() + "-"; //ハイフンをくっつけて文字列として認識させる 2ContentValues values = new ContentValues(); 3values.put("String_1", editText1.getText().toString()); 4values.put("String_2", str); 5

取り出し部分

java

1string_1[i] = c.getString(0); 2string_2[i] = c.getString(1); 3string_2[i] = string_2[i].substring(0, 20);  //20字目までで切り取る
keicha_hrs👍を押しています

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

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

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

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

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

guest

回答2

0

SQLiteの整数(符号付き整数)は、最大8バイト(64ビット)で格納されます。
64ビットのうち、最上位の1ビットは符号に使われますから、63ビットで数値を表すことになります。
表現できるのは16進数で、0x0000000000000000 ~ 0x7FFFFFFFFFFFFFFF の範囲
10進数だと、0 ~ ‭9223372036854775807‬ の範囲です。

表現できる最大の数 9223372036854775807‬ は19桁ですから、ここに20桁の値を入れることはできません。
整数として格納することができない大きな値なので、SQLiteでは実数(REAL)型の値として格納されているのだと思われます。

投稿2017/12/26 06:05

coco_bauer

総合スコア6915

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

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

HW_

2017/12/26 08:08

詳しくありがとうございます。 実数型として格納されているため、20桁は入れることができないということですが、これを文字列として格納することはできないでしょうか。 質問文に追記したのですが、数字以外のものをくっつけることで文字列として認識させる手段以外に文字列として格納する方法はありますでしょうか?
guest

0

ベストアンサー

db側のカラムの型がTEXTではなく数値型(INTEGER/REAL)になっているのでは?

【追記】

SQLiteのSTRINGは文字列(テキスト)ではありません。

3.1.1. Affinity Name Examples

And the declared type of "STRING" has an affinity of NUMERIC, not TEXT.

実際にdbファイルの中を見て確認して下さい。

sql

1select typeof(String_2) from Test;

などとして、実際の型を確認してみて下さい。

投稿2017/12/26 05:16

編集2017/12/26 08:27
fuzzball

総合スコア16731

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

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

HW_

2017/12/26 07:52

回答ありがとうございます。 カラムの型についてはMyOpenHelperというクラスで定義しているのですが、 "String_2 String not null" としてString型で定義しております。
fuzzball

2017/12/26 08:15

回答に追記しました。
PineMatsu

2017/12/26 08:23

横から失礼します。 そうではなくて、"String_2 TEXT not null"で定義したらどうですか?ということだと思います。
fuzzball

2017/12/26 08:28 編集

@PineMatsu さん 私宛でしょうか?「そうではなくて」はどこに掛かっているんでしょうか?
PineMatsu

2017/12/26 08:36

すいません。HW_さんのコメントに対するものです。fuzzballさん宛ではないです。 「"String_2 String not null"としてString型で定義しております。」 に掛けています。 タッチの差で書き込みが遅れてしまいました^^;
fuzzball

2017/12/26 08:49

回答が回りくどいから突っ込まれているのかと、ちょっとだけ思ってしまいましたw こちらこそ失礼しました。
HW_

2017/12/26 08:55

お二方ありがとうございます。 Stringがダメだったんですね、javaの感覚だったのですっかり勘違いしていました。 TEXTに変更することで解決しました。ありがとうございました。 私の理解が及んでいないせいでややこしい話の流れになってすみませんでした;;
PineMatsu

2017/12/26 09:00

しまった! ベストアンサーを貰えるのなら自ら回答を書けばよかったかなぁ(笑)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問