web-dev-qa-db-ja.com

Android SQLiteの問題-テーブル...には列という名前がありません

このエラーが発生しています-07-03 12:29:18.643: E/SQLiteLog(5181): (1) table accounts has no column named otherNotes

これは私のコードです:

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "accountsManager";
private static final String TABLE_ACCOUNTS = "accounts";

private static final String KEY_ID = "id";
private static final String KEY_TITLE = "title";
private static final String KEY_USERID = "userId";
private static final String KEY_PASSWORD = "password";
private static final String KEY_LOGINURL = "loginUrl";
private static final String KEY_OTHERNOTES = "otherNotes";

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public void onCreate(SQLiteDatabase db) {
    String CREATE_ACCOUNTS_TABLE = "CREATE TABLE " + TABLE_ACCOUNTS + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TITLE + " TEXT,"
            + KEY_USERID + " TEXT," + KEY_PASSWORD + " TEXT," + KEY_LOGINURL + " TEXT,"
            + KEY_OTHERNOTES + " TEXT" + ");";
db.execSQL(CREATE_ACCOUNTS_TABLE);
}


public void addAccount(AccountDetails account) {
    SQLiteDatabase db = this.getWritableDatabase();
    System.out.println("Hello!");   


    ContentValues values = new ContentValues();
    values.put(KEY_TITLE, account.getTitle()); // Account Title
    values.put(KEY_USERID, account.getUserId()); // account userid
    values.put(KEY_PASSWORD, account.getPassword()); // account password
    values.put(KEY_LOGINURL, account.getLoginUrl()); // account loginurl
    values.put(KEY_OTHERNOTES, account.getOtherNotes()); // account othernotes
    Log.v("title", KEY_TITLE);


    // Inserting Row
    db.insert(TABLE_ACCOUNTS, null, values);
    db.close(); // Closing database connection
}

また、次のステートメントを削除すると:

values.put(KEY_OTHERNOTES, account.getOtherNotes()); // account othernotes

その後、パスワード...などで同じ問題が発生します。つまり、(1)テーブルアカウントにはpasswordという名前の列がありません

助けてください!!

32

後でデータベースにいくつかの列を追加したようです。 Ken Wolfには同意します。アプリのアンインストールと再インストールを検討する必要があります。 1つのより良いアプローチは、onUpdateメソッドですべてのテーブルを削除して再作成し、スキーマを変更するたびにdbバージョンを増やすことです。

71
sachin garg

まあ、あなたがテーブルを作成するための構文について自信があるなら、同じテーブルに新しい列を追加するときに起こるかもしれないよりも、そのために...

1)デバイスからアンインストールして再度実行します。

OR

2)設定->アプリ-> ClearData

OR

) "DatabaseHandler"クラスのDATABASE_NAMEを変更します(同じ問題に直面しました。しかし、DATABASE_NAMEを変更することで成功しました。)

OR

4) "DatabaseHandler"クラスのDATABASE_VERSIONを変更します(新しい列を追加した場合、自動的にアップグレードされます)

public DatabaseHandler(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
14
Kush

Benilが 上記のコメント で述べているように、データベースのバージョン番号を変更し、コードを再度実行します。

4
user2241968

SQLコードは正常に見えます。作成したデータベースオブジェクトでopen()を呼び出すのを忘れたと思います。

このメソッドをSQLクラスに追加します。

private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;

public DataBaseMain open() throws SQLException{ 
    // Open the database to make her writeable, must be called before writing 
    // to database

    ourHelper = new DbHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase();
    return this;
}

public void close(){                
    // Closing the database for writing, avoids error.
    ourHelper.close();
}

DBに電話するときに使用します。

4
dasdasd

設定からアプリの「データのクリア」をお試しください。私にとってこの問題は、私がSDカードのストレージデータであり、後でいくつかの列を追加したために発生していました。したがって、SDカードに保存する場合は、以前のデータを削除してください。

3
Ajji

テスト段階で新しい列を使用してsqliteのデータベーステーブルを更新したため、同じ問題に遭遇しました。

上記の回答に加えて、SQLiteデータベースの更新(変更後など)に本当に役立つとわかったのは ABD Idea です。

  1. アプリをアンインストールする
  2. リストアイテム
  3. アプリを殺す
  4. アプリを起動
  5. アプリを再起動
  6. アプリデータを消去
  7. アプリデータを消去して再起動する
2
daniiielak

作成クエリを間違えて修正した場合、それは可能です。

そのため、ファイルシステムにはデータベースがありますが、このデータベースにはそのような列がない可能性があります。

解決策:エミュレーターでdbファイル(data/data/com.somecompany.yourapp/databases/db)を見つけて削除し、再試行してください。

一部のsqlエクスプローラーでこのファイルを開き、その列があるかどうかを確認することもできます。

2
Andrey

ここにあなたのクエリです。これを試してください。

 String CREATE_ACCOUNTS_TABLE = "CREATE TABLE "+TABLE_ACCOUNTS+"(KEY_ID INTEGER PRIMARY KEY,KEY_TITLE TEXT,KEY_USERID TEXT,KEY_PASSWORD TEXT,KEY_LOGINURL TEXT,KEY_OTHERNOTES TEXT);";
2
Mit Bhatt

コードに問題がないことを確認したら、アプリケーションをアンインストールしてからagianを再実行してください。これで問題が解決しました。それが助けたことを願っています

2
Anyon

同様の問題があり、上記の解決策が機能しない場合は、2つのことを確認してください。

  1. 列名とデータ型の間のスペース

     COLUMN_NUMBER+" TEXT PRIMARY KEY) not  COLUMN_NUMBER+"TEXT PRIMARY KEY)
    
  2. テーブルの作成中の列の順序は、データ挿入のマップと同じである必要があります

    ContentValues values = new ContentValues();
    values.put(TEST_ID, testId);
    values.put(CLASS_NAME, className);
    values.put(SUBJECT, subject);
    
    "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "("
                + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + TEST_ID + " INTEGER,"
                + CLASS_NAME + " TEXT,"
                + SUBJECT + " TEXT,"
    
2
itin

次のようにバージョンを指定するだけです。

private static final int VERSION = 4;
1
Utopia