このエラーが発生しています-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という名前の列がありません
助けてください!!
後でデータベースにいくつかの列を追加したようです。 Ken Wolfには同意します。アプリのアンインストールと再インストールを検討する必要があります。 1つのより良いアプローチは、onUpdate
メソッドですべてのテーブルを削除して再作成し、スキーマを変更するたびにdbバージョンを増やすことです。
まあ、あなたがテーブルを作成するための構文について自信があるなら、同じテーブルに新しい列を追加するときに起こるかもしれないよりも、そのために...
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);
}
Benilが 上記のコメント で述べているように、データベースのバージョン番号を変更し、コードを再度実行します。
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に電話するときに使用します。
設定からアプリの「データのクリア」をお試しください。私にとってこの問題は、私がSDカードのストレージデータであり、後でいくつかの列を追加したために発生していました。したがって、SDカードに保存する場合は、以前のデータを削除してください。
テスト段階で新しい列を使用してsqliteのデータベーステーブルを更新したため、同じ問題に遭遇しました。
上記の回答に加えて、SQLiteデータベースの更新(変更後など)に本当に役立つとわかったのは ABD Idea です。
作成クエリを間違えて修正した場合、それは可能です。
そのため、ファイルシステムにはデータベースがありますが、このデータベースにはそのような列がない可能性があります。
解決策:エミュレーターでdbファイル(data/data/com.somecompany.yourapp/databases/db)を見つけて削除し、再試行してください。
一部のsqlエクスプローラーでこのファイルを開き、その列があるかどうかを確認することもできます。
ここにあなたのクエリです。これを試してください。
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);";
コードに問題がないことを確認したら、アプリケーションをアンインストールしてからagianを再実行してください。これで問題が解決しました。それが助けたことを願っています
同様の問題があり、上記の解決策が機能しない場合は、2つのことを確認してください。
列名とデータ型の間のスペース
COLUMN_NUMBER+" TEXT PRIMARY KEY) not COLUMN_NUMBER+"TEXT PRIMARY KEY)
テーブルの作成中の列の順序は、データ挿入のマップと同じである必要があります
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,"
次のようにバージョンを指定するだけです。
private static final int VERSION = 4;