Android SQLite issue - table... не имеет столбца с именем
Я получаю эту ошибку -
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
Тогда я получаю ту же проблему с паролем... и т.д.
i.e, (1) учетные записи таблиц не имеют столбца с именем password
Пожалуйста, помогите!!
Ответы
Ответ 1
Кажется, что вы добавили несколько столбцов позже в базу данных. Я согласен с Ken Wolf, и вы должны подумать об удалении и повторной установке вашего приложения. Один из лучших подходов - сбросить и воссоздать все таблицы в методе onUpdate
и увеличить версию db каждый раз, когда вы меняете схему.
Ответ 2
Ну, если вы согласны с синтаксисом создания таблицы, это может произойти
когда вы добавляете новый столбец в свою же таблицу, для этого...
1) Unistall с вашего устройства и запустите его снова.
ИЛИ
2) Настройка → приложение → ClearDatastrong >
ИЛИ
3) Измените DATABASE_NAME в своем классе "DatabaseHandler"
(Я столкнулся с одной и той же проблемой, но мне удалось изменить DATABASE_NAME.)
ИЛИ
4) Измените DATABASE_VERSION в своем классе "DatabaseHandler" (Если вы добавили новый столбец, который будет автоматически обновляться)
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
Ответ 3
Код 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();
}
И использовать, когда вы хотите позвонить вам БД.
Ответ 4
Как говорит Бенил в комментарии выше, измените номер версии базы данных и запустите код еще раз.
Ответ 5
Попробуйте "Очистить данные" вашего приложения из настроек.
Для меня эта проблема возникла из-за того, что я хранили данные на SD-карте, а затем добавил несколько столбцов.
Поэтому, если вы сохраняете на SD-карте, удалите предыдущие данные.
Ответ 6
Вот это ваш запрос..TRY это.
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);";
Ответ 7
Возможно, если вы допустили ошибку в запросе создания и затем исправили его,
Итак, в файловой системе у вас есть db, но этот db, возможно, не имеет такого столбца.
Решение:
в эмуляторе найдите файл db: data/data/com.somecompany.yourapp/databases/db и удалите его, затем повторите попытку.
Также можно открыть этот файл в каком-то sql-проводнике и проверить, есть ли этот столбец.
Ответ 8
Я столкнулся с той же проблемой, когда обновлял свою таблицу базы данных в sqlite новыми столбцами на этапе тестирования.
Помимо ответов, которые уже были даны выше, для обновления баз данных SQLite (например, после изменений) я нашел действительно полезным плагин ABD Idea, AndroidStudio, который позволяет:
- Удалить приложение
- Элемент списка
- Убить приложение
- Запустить приложение
- Перезагрузите приложение
- Очистить данные приложения
- Очистить данные приложения и перезагрузить
Ответ 9
Вы можете просто указать версию следующим образом:
private static final int VERSION = 4;
Ответ 10
Если вы уверены, что с вашими кодами все в порядке, попробуйте удалить приложение, а затем снова запустите его. Это решило мою проблему. Надеюсь, это помогло
Ответ 11
Для тех, у кого похожая проблема и выше решение не работает, тогда проверьте 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,"