Когда запускается SQLiteOpenHelper onCreate () / onUpgrade ()?

Я создал свои таблицы в своем SQLiteOpenHelper onCreate() но получаю

 SQLiteException: no such table 

или

 SQLiteException: no such column 

ошибки. Зачем?

ЗАМЕТКА:

(Это объединенное резюме десятков подобных вопросов каждую неделю. Попытка предоставить «канонический» вопрос / ответ на вики сообщества здесь, чтобы все эти вопросы могли быть направлены на хорошую ссылку.)

    SQLiteOpenHelper onCreate() и onUpgrade() вызывается, когда firebase database фактически открывается, например, вызовом getWritableDatabase() . База данных не открывается, когда создается объект-помощник базы данных.

    SQLiteOpenHelper версии файлов базы данных. Номер версии – это аргумент int переданный конструктору . В файле базы данных номер версии сохраняется в PRAGMA user_version .

    onCreate() запускается только тогда, когда файл базы данных не существует и только что был создан. Если onCreate() успешно возвращается (не генерирует исключение), предполагается, что firebase database будет создана с запрошенным номером версии. Как следствие, вы не должны захватывать SQLException s в onCreate() самостоятельно.

    onUpgrade() вызывается только тогда, когда существует файл базы данных, но номер сохраненной версии ниже запрошенного в конструкторе. onUpgrade() должен обновить схему таблицы до требуемой версии.

    При изменении схемы таблицы в коде ( onCreate() ) вы должны убедиться, что firebase database обновлена. Два основных подхода:

    1. Удалите старый файл базы данных, чтобы снова запустить onCreate() . Это часто бывает предпочтительным во время разработки, когда вы контролируете установленные версии и потеря данных не является проблемой. Некоторые способы удаления файла базы данных:

      • Удалите приложение. С помощью диспетчера приложений или adb uninstall your.package.name из оболочки.

      • Очистить данные приложения. Используйте диспетчер приложений.

    2. onUpgrade() версию базы данных так, чтобы onUpgrade() . Это немного сложнее, так как требуется больше кода.

      • Для обновления схемы времени разработки, где потеря данных не является проблемой, вы можете просто использовать execSQL("DROP TABLE IF EXISTS ") для удаления существующих таблиц и вызова onCreate() для воссоздания базы данных.

      • Для выпущенных версий вы должны реализовать миграцию данных в onUpgrade() чтобы ваши пользователи не теряли свои данные.

    Чтобы дополнительно добавить недостающие пункты здесь, согласно запросу Jaskey

    Версия базы данных хранится в файле базы данных SQLite .

    catch – это конструктор

     SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 

    Поэтому, когда вызывающий конструктор базы данных вызывается с name (2-й параметр), платформа проверяет, существует ли firebase database или нет, и если firebase database существует, она получает информацию о версии из заголовка файла базы данных и запускает правильный обратный вызов

    Как уже объяснялось в более старшем ответе, если firebase database с именем не существует, она вызывает onCreate .

    Ниже объяснения объясняется в примере с примером.

    Скажем, ваша первая версия приложения имела DatabaseHelper (расширение SQLiteOpenHelper ) с версией для SQLiteOpenHelper конструктора как 1 а затем вы предоставили обновленное приложение с новым исходным кодом, имеющим версию, передаваемую как 2 , а затем автоматически при создании DatabaseHelper , триггеры платформы onUpgrade по поскольку файл уже существует, но версия ниже текущей версии, которую вы передали.

    Теперь скажите, что вы планируете предоставить третью версию приложения с версией db как 3 (версия db увеличивается только тогда, когда необходимо изменить схему базы данных). При таких инкрементальных обновлениях вы должны писать логику обновления из каждой версии поэтапно для получения более удобного кода поддержки

    Пример псевдо-кода ниже:

     @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch(oldVersion) { case 1: //upgrade logic from version 1 to 2 case 2: //upgrade logic from version 2 to 3 case 3: //upgrade logic from version 3 to 4 break; default: throw new IllegalStateException( "onUpgrade() with unknown oldVersion " + oldVersion); } } 

    Обратите внимание на отсутствующий оператор break в случаях 1 и 2 . Это то, что я подразумеваю под инкрементным обновлением.

    Скажем, если старая версия равна 2 а новая версия – 4 , тогда логика обновит базу данных с 2 до 3 а затем до 4

    Если старая версия 3 а новая версия – 4 , она просто запустит логику обновления от 3 до 4

    onCreate()

    1. Когда мы создаем базу данных в первый раз (т.е. firebase database не существует) onCreate() создает базу данных с версией, которая передается в SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

    2. onCreate() создает таблицы, которые вы определили, и выполняете любой другой код, который вы написали. Однако этот метод вызывается только в случае отсутствия файла SQLite в каталоге данных вашего приложения ( /data/data/your.apps.classpath/databases ).

    3. Этот метод не будет вызываться, если вы изменили свой код и перезапустили его в эмуляторе. Если вы хотите onCreate() вам нужно использовать adb для удаления файла базы данных SQLite.

    onUpgrade()

    1. SQLiteOpenHelper должен вызвать супер-конструктор.
    2. Метод onUpgrade() будет вызываться только тогда, когда целое число версии больше, чем текущая версия, запущенная в приложении.
    3. Если вы хотите onUpgrade() метод onUpgrade() , вам необходимо увеличить номер версии в вашем коде.

    Может быть, я слишком поздно, но я хотел бы поделиться своим коротким и сладким ответом. Проверьте Ответ на ту же проблему. Это определенно поможет вам. Нет более глубоких спецификаций.

    Если вы уверены в синтаксисе создания таблицы, это может произойти, когда вы добавляете новый столбец в свою же таблицу, для этого …

    1) Удалите с устройства и запустите его снова.

    ИЛИ

    2) Настройка -> приложение -> ClearData

    ИЛИ

    3) Измените DATABASE_VERSION в своем classе «DatabaseHandler» (если вы добавили новый столбец, который будет автоматически обновляться)

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

    ИЛИ

    4) Измените DATABASE_NAME в своем classе «DatabaseHandler» (я столкнулся с такой же проблемой, но мне это удалось, изменив DATABASE_NAME ).

    Вопросы, которые следует помнить при расширении SQLiteOpenHelper

    1. super(context, DBName, null, DBversion); – Это должна быть вызвана первая строка конструктора
    2. переопределить onCreate и onUpgrade (при необходимости)
    3. onCreate будет вызываться только тогда, когда getWritableDatabase() или getReadableDatabase() . И это будет вызываться только один раз, когда имя DBName указанное на первом шаге, недоступно. Вы можете добавить запрос onCreate метод onCreate
    4. Всякий раз, когда вы хотите добавить новую таблицу, просто измените DBversion и выполните запросы в таблице onUpgrade или просто удалите, затем установите приложение.

    Удалите приложение из эмулятора или устройства. Запустите приложение еще раз. (OnCreate () не выполняется, когда firebase database уже существует)

    такая таблица не найдена, главным образом, когда вы не открыли class SQLiteOpenHelper с помощью getwritabledata() и перед этим вам также нужно вызвать make constructor с databasename & version. И OnUpgrade вызывается всякий раз, когда есть значение обновления в номере версии, указанном в classе SQLiteOpenHelper .

    Ниже приведен fragment кода (такой столбец не найден из-за заклинания в имени столбца):

     public class database_db { entry_data endb; String file_name="Record.db"; SQLiteDatabase sq; public database_db(Context c) { endb=new entry_data(c, file_name, null, 8); } public database_db open() { sq=endb.getWritableDatabase(); return this; } public Cursor getdata(String table) { return sq.query(table, null, null, null, null, null, null); } public long insert_data(String table,ContentValues value) { return sq.insert(table, null, value); } public void close() { sq.close(); } public void delete(String table) { sq.delete(table,null,null); } } class entry_data extends SQLiteOpenHelper { public entry_data(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase sqdb) { // TODO Auto-generated method stub sqdb.execSQL("CREATE TABLE IF NOT EXISTS 'YOUR_TABLE_NAME'(Column_1 text not null,Column_2 text not null);"); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { onCreate(db); } } 

    Вы можете создать базу данных и таблицу, например

     public class DbHelper extends SQLiteOpenHelper { private static final String DBNAME = "testdatbase.db"; private static final int VERSION = 1; public DbHelper(Context context) { super(context, DBNAME, null, VERSION); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL("create table BookDb(id integer primary key autoincrement,BookName text,Author text,IssuedOn text,DueDate text,Fine text,Totalfine text"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS BookDb"); onCreate(db); } } 

    Примечание. Если вы хотите создать другую таблицу или добавить столбцы или нет такой таблицы, просто увеличьте VERSION

    Ваше имя базы данных должно заканчиваться на .db, также строки запроса должны иметь терминатор (;)

    Если вы забудете указать строку «name» в качестве второго аргумента конструктору, она создаст базу данных «in-memory», которая будет стерта при закрытии приложения.

    onCreate вызывается в первый раз, когда требуется создание таблиц. Нам нужно переопределить этот метод, когда мы пишем сценарий для создания таблицы, который выполняется SQLiteDatabase. метод execSQL. После выполнения при первом развертывании этот метод не будет вызываться в дальнейшем.

    onUpgrade Этот метод вызывается при обновлении версии базы данных. Предположим, что при первом развертывании версия базы данных была 1, а во втором развертывании произошло изменение структуры базы данных, например добавление дополнительного столбца в таблицу. Предположим, что версия базы данных теперь 2.

    Метод Sqliteopenhelper имеет методы создания и обновления, создание используется, когда каждая таблица создается впервые, и метод обновления будет вызываться каждый раз, когда изменяется номер столбца таблицы.

    Interesting Posts

    Angular2 – компонент в динамически созданный элемент

    Обнаружить, если метод был переопределен с помощью Reflection (C #)

    Завершение сеанса StopWatch с помощью делегата или lambda?

    Windows Repair Disc – откат драйвера из командной строки Windows? (Windows in evil Обновить цикл перезагрузки)

    Как программно подключить клиента к службе WCF?

    Hp probook white screen с ошибкой отменить изображение и загрузить в следующий порядок загрузки

    Почему некоторые файлы pdf / acrobat не поддерживают «предыдущий просмотр»?

    Как использовать SharedPreferences

    Как я могу поделиться своим подключением к Интернету через Wi-Fi из командной строки?

    Все окна, возвращающиеся к основному монитору после пробуждения от сна

    Лучший способ писать байты в середине файла в Java

    Изменение текста кнопки onclick

    Как выровнять мертвую точку изображения с помощью бутстрапа

    Swift: Как использовать sizeof?

    Каждый раз появляется всплывающее окно Outlook / Windows

    Давайте будем гением компьютера.