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

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

ただいまの
回答率

88.09%

Android StudioのSQLiteでtableにvaluesをinsertできない

解決済

回答 1

投稿

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

score 10

前提・実現したいこと

SQLiteでテーブルを作成した後にinsertしたい。

javaでAndroidアプリを作成中でFrament内のEditTextから取得したStringをSQLiteで作ったDBのテーブルへinsertしたいです。

しかしエミュレータ上でテキストを打ってsaveしてDBにinsertしようとするとCOLUMNがテーブルに存在しないとエラーが出ていて、対処法がわからず困っております。
おそらくcreate文あたりに問題があるのだと思うのですが、初心者なもので上手いLogの出力方法もわからないです。

memoと名付けられたCOLUMNがないというエラーですが、memoのCOLUMNを無くして実行しても、今度はroasterと名付けられたCOLUMNがないと言われました。

ご教授お願い致します。。。

発生している問題・エラーメッセージ

2019-03-21 16:17:33.487 16716-16716/com.example.yuki0.coffeelog E/SQLiteLog: (1) table coffeerecord has no column named memo
2019-03-21 16:17:33.491 16716-16716/com.example.yuki0.coffeelog E/SQLiteDatabase: Error inserting date=2019/2/21 rating=3.5 memo=b beans=a roaster=c
    android.database.sqlite.SQLiteException: table coffeerecord has no column named memo (code 1): , while compiling: INSERT INTO coffeerecord(date,rating,memo,beans,roaster) VALUES (?,?,?,?,?)

該当のソースコード

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DBNAME = "coffeerecord.db";
    private static final int DBVERSION = 6;
    public static final String TABLE_COFFEERECORD = "coffeerecord";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_DATE = "date";
    public static final String COLUMN_BEANS = "beans";
    public static final String COLUMN_ROASTER = "roaster";
    public static final String COLUMN_NOTE = "memo";
    public static final String COLUMN_RATING = "rating";

    private static final String CREATE_TABLE_SQL =
            "create table " + TABLE_COFFEERECORD
                    + "(" + COLUMN_ID + " integer primary key autoincrement,"
                    + COLUMN_DATE + " text not null, "
                    + COLUMN_RATING + " text not null, "
                    + COLUMN_BEANS + " text not null, "
                    + COLUMN_ROASTER + " text not null, "
                    + COLUMN_NOTE + " text not null )";


    public DatabaseHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(CREATE_TABLE_SQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

}
//MainActivityのメソッド
public void saverecord(String s1, String s2, String s3, String s4, String s5) {     //insert data to DB

        SQLiteDatabase db = mDBHelper.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.COLUMN_DATE, s1);
        values.put(DatabaseHelper.COLUMN_BEANS, s2);
        values.put(DatabaseHelper.COLUMN_ROASTER, s3);
        values.put(DatabaseHelper.COLUMN_NOTE, s4);
        values.put(DatabaseHelper.COLUMN_RATING, s5);

        Uri uri = getContentResolver().insert(CoffeeContentProvider.CONTENT_URI, values);
        showToast("SAVED");

fragement

package com.example.yuki0.coffeelog;

import android.content.ContentValues;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.format.Time;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RatingBar;


public class LogFragment extends Fragment  {


    public static String Date;
    public static String ShopName;
    public static String BeansName;
    public static String Memo;
    public RatingBar ratingBar;
    public static float num =0;
    public static String ratenum;
    private EditText editBeansName;
    private EditText editShopName;
    private EditText editMemo;
    private EditText editDate;

    public static LogFragment newInstance() {
        LogFragment fragment = new LogFragment();
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup)inflater.inflate(R.layout.fragment_log, null);
        return root;
    }


   @Override
   public void onResume(){
        super.onResume();
        Time time = new Time("Asia/Tokyo");
        time.setToNow();
        editBeansName = (EditText)getView().findViewById(R.id.EditBeansName);
        editShopName = (EditText)getView().findViewById(R.id.EditShopName);
        editMemo = (EditText)getView().findViewById(R.id.EditMemo);
        editDate = (EditText)getView().findViewById(R.id.EditDate);
        ratingBar = (RatingBar)getView().findViewById(R.id.ratingBar);
        ratingBar.setRating(3);
        String date = time.year+"/"+time.month+"/"+time.monthDay;
        editDate.setText(date);

       ratingBar.setOnRatingBarChangeListener(
               new RatingBar.OnRatingBarChangeListener() {
                   public void onRatingChanged(
                           RatingBar ratingBar,
                           float rating,
                           boolean fromUser) {
                       // RatingBar のレイティング数が変わったときの動作
                       float num = ratingBar.getRating();
                       ratenum = Float.toString(num);
                   }
               }
       );


       Button btn = (Button)getActivity().findViewById(R.id.savebutton);
       btn.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View view){
               //insert data to DB
               try {
                   Date = editDate.getText().toString();
               }catch (NumberFormatException e){
                   Date = "日付を入力";
               }

               try{
                   ShopName = editShopName.getText().toString();
               }catch (NumberFormatException e){
                   ShopName = "";
               }
               try {
                   BeansName = editBeansName.getText().toString();
               }catch(NumberFormatException e){
                   BeansName = "";
               }
               try {
                   Memo = editMemo.getText().toString();
               }catch (NumberFormatException e){
                   Memo ="";
               }
               ((MainActivity)getActivity()).saverecord(Date,BeansName, Memo, ShopName,ratenum);

           }
       });

   }

}

ContentProvider

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.annotation.Nullable;

public class CoffeeContentProvider extends ContentProvider {

    private DatabaseHelper mDbHelper;

    private static final int COFFEERECOERD = 1;
    private static final int COFFEERECOERD_ID = 2;
    private static final String AUTHORITY = "com.example.yuki0.coffeelog.CoffeeContentProvider";

    private static final String BASE_PARH = "coffeerecord";

    public static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORITY+"/"+BASE_PARH);
    private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    static{
        uriMatcher.addURI(AUTHORITY, BASE_PARH, COFFEERECOERD);
        uriMatcher.addURI(AUTHORITY, BASE_PARH +"/#", COFFEERECOERD_ID);
    }

    @Override
    public boolean onCreate(){
        mDbHelper = new DatabaseHelper(getContext());
        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder){
        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();

        queryBuilder.setTables(DatabaseHelper.TABLE_COFFEERECORD);

        int uriType = uriMatcher.match(uri);

        switch(uriType){
            case COFFEERECOERD:
                break;

            case COFFEERECOERD_ID:
                queryBuilder.appendWhere(DatabaseHelper.COLUMN_ID + "=" + uri.getLastPathSegment());
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: "+ uri);
        }

        SQLiteDatabase db = mDbHelper.getWritableDatabase();
        Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs,null,null,sortOrder);

        return cursor;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values){
        SQLiteDatabase sqlDB = mDbHelper.getWritableDatabase();
        int uriType = uriMatcher.match(uri);
        long id = 0;
        switch(uriType){
            case COFFEERECOERD:
                id = sqlDB.insert(DatabaseHelper.TABLE_COFFEERECORD, null,values);
                break;

            default:
                throw new IllegalArgumentException("Unknown URI: "+ uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return Uri.withAppendedPath(uri,String.valueOf(id));

    }

    @Nullable
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs){
        return 0;
    }

    @Nullable
    @Override
    public String getType(Uri uri){
        return null;
    }

    @Nullable
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs){
        return 0;
    }

}

試したこと

DBVersion を変えてみたりしたのですがダメでした。
ContentProviderを介さず直接DBにinsertしてもダメでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • jimbe

    2019/03/21 17:44

    実際にデータベースの列がどうなっているか, ご確認されましたでしょうか.

    キャンセル

  • keicha_hrs

    2019/03/21 18:28

    memoやroasterはプログラム作成途中で追加したカラムなのではありませんか?DatabaseHelper#onCreate()の内容を変更したとしても、Android Studioが気を利かせて既存のテーブルを再生成してくれるような機能は存在しないので、端末内には本当にmemoやroasterというカラムが存在しないテーブルが残存しているような気がします。デバッグ中のアプリを端末の操作によって一旦アンインストールして、それからもう一度同じプログラムを実行してみても、現象は再現するでしょうか?

    キャンセル

  • BaristaYuki

    2019/03/21 20:04

    端末からアプリをアンインストールしたら解決しました!
    ありがとうございます。

    キャンセル

回答 1

check解決した方法

0

端末からアプリをアンインストールしたら解決いたしました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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