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

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

ただいまの
回答率

90.37%

  • Android

    7509questions

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

  • SQLite

    818questions

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

android でsqliteの更新ができず、no such clumnがでます

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 5,068

kuma39339

score 1

前提・実現したいこと

ここに質問したいことを詳細に書いてください
androidStudioで英単語アプリを作成しています。
sqlite更新の処理をいれたときにエラーメッセージがでてきました。

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

E/SQLiteLog: (1) no such column: answer
E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: com.example.nkd.englishapp, PID: 6242
                                                                          android.database.sqlite.SQLiteException: no such column: answer (code 1): , while compiling: UPDATE englishword SET answer=? WHERE id_ = ?
                                                                              at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                              at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
                                                                              at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
                                                                              at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                                              at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                                              at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
                                                                              at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1576)
                                                                              at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1524)
                                                                              at com.example.nkd.englishapp.DatabaseHelper.answerWord(DatabaseHelper.java:87)
                                                                              at com.example.nkd.englishapp.wordActivity.onClick(wordActivity.java:81)
                                                                              at android.view.View.performClick(View.java:4781)
                                                                              at android.view.View$PerformClick.run(View.java:19874)
                                                                              at android.os.Handler.handleCallback(Handler.java:739)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                              at android.os.Looper.loop(Looper.java:135)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5288)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at java.lang.reflect.Method.invoke(Method.java:372)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

該当のソースコード

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DBNAME = "word.db";
    private static final int DBVERSION = 1;
    public static final String TABLE_ENGLISHWORD = "englishword";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_ENGLISHWORD = "englishword";
    public static final String COLUMN_WORD = "word";
    public static final String COLUMN_ANSWER = "answer";
    private static final String CREATE_TABLE_SQL =
            "create table " + TABLE_ENGLISHWORD + ""
                    + "(" + COLUMN_ID + " integer primary key autoincrement,"
                    + COLUMN_ENGLISHWORD + " text not null,"
                    + COLUMN_WORD + "text not null,"
                    + COLUMN_ANSWER + "integer not null)";

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


    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_SQL);
        db.execSQL("INSERT INTO " + TABLE_ENGLISHWORD + " VALUES(0,'apple','りんご',0);");
        db.execSQL("INSERT INTO " + TABLE_ENGLISHWORD + " VALUES(1,'test','テスト',0);");
        db.execSQL("INSERT INTO " + TABLE_ENGLISHWORD + " VALUES(2,'table','机',0);");
        db.execSQL("INSERT INTO " + TABLE_ENGLISHWORD + " VALUES(3,'giutar','ギター',0);");
        db.execSQL("INSERT INTO " + TABLE_ENGLISHWORD + " VALUES(4,'product','製品',0);");
        db.execSQL("INSERT INTO " + TABLE_ENGLISHWORD + " VALUES(5,'ddemand','需要、供給',0);");
        db.execSQL("INSERT INTO " + TABLE_ENGLISHWORD + " VALUES(6,'especially','特に',0);");
        db.execSQL("INSERT INTO " + TABLE_ENGLISHWORD + " VALUES(7,'increase','増える、増やす',0);");
        db.execSQL("INSERT INTO " + TABLE_ENGLISHWORD + " VALUES(8,'release','公表する、発売する',0);");
        db.execSQL("INSERT INTO " + TABLE_ENGLISHWORD + " VALUES(9,'work overtime','時間外労働をする、残業する',0);");


    }





    /*public void answerWord(SQLiteDatabase db, int id) {
        String updateSql = "UPDATE englishword SET answer = 1 WHERE _id = ?";
        db.execSQL(updateSql, new String[]{String.valueOf(id)});
    }*/

    public void answerWord(SQLiteDatabase db, int id) {
        ContentValues values = new ContentValues();
        values.put(COLUMN_ANSWER, 1);
        db.update("englishword", values, "id_ = ?", new String[]{String.valueOf(id)});
    }


}

試したこと

なんで、no such culumnになるのかわけがわからないです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

+ COLUMN_ANSWER + "integer not null)";
この結果は「answerinteger not null)」という風に文字列がくっついちゃうと思います。
COLUMN_WORDのあたりの文も同様ですね。他と同じように先頭に空白を入れれば解決するはずです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/09 13:00

    スペースはすでに入ってました。

    キャンセル

  • 2016/09/09 13:11

    それは失礼しました。何らかの理由で古いsqliteファイルが残ってしまっているのかもしれませんが、こちらからではそれはわかりませんね。
    となるとsqliteファイルの中身を見てみるしかなさそうですね。
    windowsの方に引っ張ってこれるなら
    ・pupsqlite
    https://www.eonet.ne.jp/~pup/software.html
    といったビューワを使うことでDBの詳細を調べる事ができます。
    (macの場合は恐らく類似のソフトがあるとは思いますが詳細はわかりません)

    キャンセル

  • 2016/09/09 13:39

    申し訳ございません。スペースをいれる場所を間違えていました。ishi9様の言うとうり、
    スペースをいれると治りました。ありがとうございました

    キャンセル

+1

エラーの内容は「answerというカラムはない」というものです。
原因は他の方も回答されているとおり、スペースがないことによりカラム名が意図したものと異なっているためと思われます。
「CREATE_TABLE_SQL」をコンソールやアプリの画面に出力して、実際にどういうSQLが実行されているかをご確認ください。

なお、SQLiteOpenHelperのonCreateはデータベースファイルが存在しない場合に実行されます。
SQLを修正後(問題がない場合)は、一度アプリをアンインストールして内部データを削除してください

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/09 13:51

    回答ありがとうございます。
    そのとおりでした

    キャンセル

0

Create文が怪しいです。
カラム名と型の間にスペースが無いように見えます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/09 12:51

    create文はうまくいってると思います。update文のほかにselect文を実行しましたが、そちらはうまくいって表示されます。コメントありがとうございます。

    キャンセル

  • 2016/09/09 13:40

    スペースをいれるところを間違えてました。yuna様の言うとうり、スペースをいれるとうまくいきました。ありがとうございます。

    キャンセル

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

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

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

  • Android

    7509questions

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

  • SQLite

    818questions

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