Я создал свои таблицы в моем, SQLiteOpenHelper
onCreate()
но получаю
SQLiteException: no such table
или
SQLiteException: no such column
ошибки. Зачем?
НОТА:
(Это объединенное резюме десятков подобных вопросов каждую неделю. Попытка предоставить «канонический» вопрос / ответ вики сообщества для того, чтобы все эти вопросы могли быть направлены на хорошую ссылку.)
Ответы:
SQLiteOpenHelper
onCreate()
иonUpgrade()
обратные вызовы вызываются, когда база данных фактически открыта, например, путем вызоваgetWritableDatabase()
. База данных не открывается при создании самого вспомогательного объекта базы данных.SQLiteOpenHelper
версии файлов базы данных. Номер версии - этоint
аргумент, передаваемый конструктору . В файле базы данных номер версии хранится вPRAGMA user_version
.onCreate()
запускается только тогда, когда файл базы данных не существует и только что был создан. ЕслиonCreate()
возвращается успешно (не выдает исключение), предполагается, что база данных будет создана с запрошенным номером версии. Как следствие, вы не должны ловитьSQLException
s вonCreate()
себе.onUpgrade()
вызывается только тогда, когда файл базы данных существует, но номер сохраненной версии меньше, чем запрашивается в конструкторе.onUpgrade()
Следует обновить схему таблицы для запрашиваемой версии.При изменении схемы таблицы в code (
onCreate()
) вы должны убедиться, что база данных обновлена. Два основных подхода:Удалите старый файл базы данных, чтобы
onCreate()
запустить его снова. Это часто предпочитается во время разработки, когда у вас есть контроль над установленными версиями, и потеря данных не является проблемой. Несколько способов удалить файл базы данных:Удалите приложение. Используйте менеджер приложений или
adb uninstall your.package.name
из оболочки.Очистить данные приложения. Используйте менеджер приложений.
Увеличьте версию базы данных, чтобы
onUpgrade()
она вызывалась. Это немного сложнее, так как требуется больше кода.Для обновления схемы времени разработки, когда потеря данных не является проблемой, вы можете просто использовать ее
execSQL("DROP TABLE IF EXISTS <tablename>")
для удаления существующих таблиц и вызоваonCreate()
для воссоздания базы данных.Для выпущенных версий вы должны реализовать миграцию данных,
onUpgrade()
чтобы ваши пользователи не потеряли свои данные.источник
onUpdate()
Проверьте каждую старую версию и выполните правильную миграцию данных. И затем, когда пользователь обновляет свое приложение (у него есть старые файлы базы данных),onUpgrade
будет запущен, а если пользователь только что установил,onCreate()
запускается.Чтобы добавить недостающие очки здесь, согласно запросу Jaskey
Версия базы данных хранится в
SQLite
файле базы данных.улов это конструктор
Поэтому, когда вспомогательный конструктор базы данных вызывается с
name
(2-й параметр), платформа проверяет, существует ли база данных или нет, и если база данных существует, она получает информацию о версии из заголовка файла базы данных и запускает правильный обратный вызовКак уже объяснялось в предыдущем ответе, если база данных с таким именем не существует, она срабатывает
onCreate
.Ниже объяснение объясняет
onUpgrade
случай с примером.Скажем, ваша первая версия приложения имела
DatabaseHelper
(расширяющуюсяSQLiteOpenHelper
) версию с передачей в конструктор as,1
а затем вы предоставили обновленное приложение с новым исходным кодом, в котором версия была передана как2
, а затем автоматически приDatabaseHelper
создании платформа запускаетсяonUpgrade
, увидев, что файл уже существует, но версия ниже текущей версии, которую вы прошли.Теперь предположим, что вы планируете предоставить третью версию приложения с версией db как
3
(версия db увеличивается только тогда, когда требуется изменить схему базы данных). В таких инкрементальных обновлениях вы должны писать логику обновления для каждой версии постепенно для лучшего сопровождения кода.Пример псевдокода ниже:
Обратите внимание на недостающее
break
утверждение в случае1
и2
. Это то, что я имею в виду под постепенным обновлением.Скажем, если старая версия
2
и новая версия4
, то логика будет обновлять базу данных с2
до,3
а затем до4
Если старая версия
3
и новая версия4
, она будет просто запустить обновления логики3
в4
источник
onCreate()
Когда мы создаем базу данных в первый раз (т.е. база данных не существует),
onCreate()
создайте базу данных с версией, которая передается вSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
onCreate()
Метод создает таблицы, которые вы определили, и выполняет любой другой код, который вы написали. Однако этот метод вызывается только в том случае, если в каталоге данных вашего приложения отсутствует файл SQLite (/data/data/your.apps.classpath/databases
).Этот метод не будет вызываться, если вы изменили свой код и перезапустились в эмуляторе. Если вы хотите
onCreate()
запустить, вам нужно использовать adb для удаления файла базы данных SQLite.onUpgrade()
SQLiteOpenHelper
должен вызвать супер конструктор.onUpgrade()
Метод будет вызываться только тогда , когда версия целое больше , чем текущая версия работает в приложении.onUpgrade()
метод вызывался, вам нужно увеличить номер версии в своем коде.источник
Может быть, я опоздал, но я хотел бы поделиться своим коротким и сладким ответом. Пожалуйста, проверьте ответ на ту же проблему. Это определенно поможет вам. Нет более глубоких спецификаций.
Если вы уверены в синтаксисе создания таблицы, то это может произойти при добавлении нового столбца в ту же таблицу, для этого ...
1) Удалите с вашего устройства и запустите его снова.
ИЛИ
2) Настройка -> приложение -> ClearData
ИЛИ
3) Измените
DATABASE_VERSION
свой класс DatabaseHandler (если вы добавили новый столбец, он обновится автоматически)ИЛИ
4) Изменение
DATABASE_NAME
в вашем классе «DatabaseHandler» (я столкнулся с той же проблемой. Но я преуспел, изменивDATABASE_NAME
.)источник
Что следует помнить при расширении
SQLiteOpenHelper
super(context, DBName, null, DBversion);
- Это должно быть вызвано первой строкой конструктораonCreate
иonUpgrade
(при необходимости)onCreate
будет вызываться только когдаgetWritableDatabase()
илиgetReadableDatabase()
выполняется. И это будет вызвано только один раз, когдаDBName
указанный на первом шаге недоступен. Вы можете добавить создать запрос таблицы поonCreate
методуDBversion
и выполните запросы вonUpgrade
таблице или просто удалите, а затем установите приложение.источник
onCreate вызывается впервые, когда необходимо создание таблиц. Нам нужно переопределить этот метод, где мы пишем скрипт для создания таблицы, который выполняется SQLiteDatabase. метод execSQL. После выполнения при первом развертывании этот метод не будет вызываться далее.
onUpgrade Этот метод вызывается при обновлении версии базы данных. Предположим, что для первого развертывания версия базы данных была равна 1, а во втором развертывании произошли изменения в структуре базы данных, такие как добавление дополнительного столбца в таблицу. Предположим, версия базы данных сейчас 2.
источник
Вы можете создать базу данных и таблицу, как
Примечание: если вы хотите создать другую таблицу или добавить столбцы или нет такой таблицы, просто увеличьте VERSION
источник
База данных Sqlite переопределяет два метода
1) onCreate (): этот метод вызывается только один раз, когда приложение запускается в первый раз. Так называется только один раз
2) onUpgrade () Этот метод вызывается, когда мы меняем версию базы данных, затем вызывается этот метод. Он используется для изменения структуры таблицы, например, для добавления нового столбца после создания схемы БД.
источник
такая таблица не найдена, в основном, когда вы не открыли
SQLiteOpenHelper
класс с,getwritabledata()
и перед этим вам также нужно вызвать конструктор make с базой данных и версией. ИOnUpgrade
вызывается всякий раз, когда есть значение обновления в номере версии, указанном вSQLiteOpenHelper
классе.Ниже приведен фрагмент кода (такой столбец не может быть найден из-за заклинания в имени столбца):
источник
Если вы забыли предоставить строку «имя» в качестве второго аргумента для конструктора, она создаст базу данных «в памяти», которая будет удалена при закрытии приложения.
источник
Удалите ваше приложение с эмулятора или устройства. Запустите приложение еще раз. (OnCreate () не выполняется, когда база данных уже существует)
источник
Имя вашей базы данных должно заканчиваться на .db, а строки запроса должны иметь терминатор (;)
источник
Еще раз проверьте ваш запрос в классе DatabaseHandler / DatabaseManager (который вы когда-либо использовали)
источник
В моем случае я получаю элементы из XML-файла
<string-array>
, где храню<item>
s. В этих<item>
я держу строки SQL и применяю их по одномуdatabaseBuilder.addMigrations(migration)
. Я сделал одну ошибку, забыл добавить\
перед цитатой и получил исключение:android.database.sqlite.SQLiteException: такого столбца нет: some_value (код 1 SQLITE_ERROR): при компиляции: INSERT INTO имя_таблицы (id, name) VALUES (1, some_value)
Итак, это правильный вариант:
источник
В методе Sqliteopenhelper есть методы create и upgrade, create используется, когда любая таблица создается впервые, и метод upgrade будет вызываться каждый раз, когда изменяется номер столбца таблицы.
источник