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

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

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

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

Android Studio

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

Q&A

解決済

1回答

1869閲覧

AndroidStudioでの日付型データ取得について

Aies

総合スコア21

SQLite

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

Android Studio

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

0グッド

1クリップ

投稿2018/12/27 16:55

編集2018/12/28 06:14

現在AndroidStudioの勉強をしようと家計簿アプリを作ろうと思っています。

そこで入力画面でその日買った商品と金額、日付を入力する機能を作ろうと思い、DatePickerDialogを使って日付を選択し、その日付を取得してSQLiteで作ったデータベースに入れたいのですが、data mismatchと出て追加することができません。日付の部分なしで実行したときはエラーがでなかったので、日付の部分でエラーが発生していると思います。

現在の状況としましては、テーブル作成はTEXT型で作成し、EditTextからString型で「2018/12/28」のような形で受け取ってString型でいれようとしています。

調べ方が悪いのか、まったく解決しないので、よろしければご助言をお願いします。

追記
【データベースの構造】
private static final String PRIMARY_KEY = "date";
private static final String COLUMN_CATEGORY = "category";
private static final String COLUMN_PRICE= "price";
private static final String COLUMN_MEMO = "memo";
private static final String _ID = "_id";

private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + TABLE_NAME + " (" +
PRIMARY_KEY + " PRIMARY KEY," +
_ID + " INTEGER PRIMARY KEY," +
PRIMARY_KEY + " TEXT," +
COLUMN_CATEGORY + " TEXT," +
COLUMN_PRICE + " INTEGER," +
COLUMN_MEMO + " TEXT)";

【データベースへの追加分】
//オブジェクトを取得
EditText gPrice = (EditText) findViewById(R.id.price);
Spinner gCategory = (Spinner) findViewById(R.id.category);
EditText gMemo = (EditText) findViewById(R.id.memo);
EditText gDate = (EditText) findViewById(R.id.date);

//値を取得 final int price = Integer.parseInt(gPrice.getText().toString()); final String category = (String)gCategory.getSelectedItem(); final String memo = gMemo.getText().toString(); final String date = gDate.getText().toString(); insertData(db, price, category, memo, date); } public void insertData(SQLiteDatabase db, int price, String category, String memo, String date){ ContentValues values = new ContentValues(); values.put("date", date); values.put("memo", memo); values.put("category", category); values.put("price", price); db.insert("kakeibodb", null, values); }

【エラー文】
E/SQLiteLog: (20) statement aborts at 5: [INSERT INTO kakeibodb(date,memo,category,price) VALUES (?,?,?,?)] datatype mismatch
E/SQLiteDatabase: Error inserting date=2018/12/26 memo=b category=食費 price=8
android.database.sqlite.SQLiteDatatypeMismatchException: datatype mismatch (code 20 SQLITE_MISMATCH)

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

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

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

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

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

y_waiwai

2018/12/28 00:13 編集

データベースのデータ構造、うまくいかないというコードを提示しましょう また、エラーメッセージもそのままの形で提示してください
Aies

2018/12/28 06:12

追記いたしました。ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

ご提示いただいたコードのSQL_CREATE_ENTRIESをその通り展開すると(TABLE_NAMEが"kakeibodb"なのは推測)、

sql

1CREATE TABLE kakeibodb( 2 date PRIMARY KEY, 3 _id INTEGER PRIMARY KEY, 4 date TEXT, 5 category TEXT, 6 price INTEGER, 7 memo TEXT);

このようなSQL文になるのですが、これではテーブルは作成できないはずです。dateというカラムが2箇所ありますし、PRIMARY KEYが2つ設定されていますし。ただ、テーブルが作成できていないのにSQLiteDatatypeMismatchExceptionになるというのも不思議で、示されているコードと実際に動かしているのが違うのではないかと思えます。

投稿2018/12/29 07:58

keicha_hrs

総合スコア6766

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

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

Aies

2018/12/29 10:57 編集

回答ありがとうございます。 SQLiteではプライマリ宣言と別に型の宣言が必要なのかと勘違いしていました。 プライマリ2つについては、複合主キーにしたかったのですが、この書き方は違いますか? SQLiteをちょこちょこ変えて実行していたので前のキャッシュが残っていたのかもしれません。
keicha_hrs

2018/12/29 12:03

そういう目的ならば、 CREATE TABLE kakeibodb( _id INTEGER, date TEXT, category TEXT, price INTEGER, memo TEXT, PRIMARY KEY(_id,date)); のようにすればいいのではないでしょうか。なお、テーブル作成の処理は端末内にデータベースファイルが存在しないときしか走りません。ですから、テーブルの構造を改めたときには、実行前にファイルを削除しておく必要があります。削除方法はファイルの置き場所にもよるのですが、アプリ専用領域に置いているのなら端末操作でアプリのアンインストールを行えば削除されるはずです。
Aies

2018/12/30 03:10

主キー宣言はそのように書かないといけないんですね。勘違いしていました。 なるほど、アンインストールが必要なんですね。ありがとうごさいます。 すみません。今試せる状態にないので、試せるようになったら、試してみようと思います。
Aies

2019/01/04 01:45

解決しました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問