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) Настройка → приложение → ClearData​​strong >

ИЛИ

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, который позволяет:

  1. Удалить приложение
  2. Элемент списка
  3. Убить приложение
  4. Запустить приложение
  5. Перезагрузите приложение
  6. Очистить данные приложения
  7. Очистить данные приложения и перезагрузить

Ответ 9

Вы можете просто указать версию следующим образом:

private static final int VERSION = 4;

Ответ 10

Если вы уверены, что с вашими кодами все в порядке, попробуйте удалить приложение, а затем снова запустите его. Это решило мою проблему. Надеюсь, это помогло

Ответ 11

Для тех, у кого похожая проблема и выше решение не работает, тогда проверьте 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,"