Как проверить, существует ли таблица в базе данных Android SQLite?
114775 просмотра
12 ответа
У меня есть приложение для Android, которое должно проверить, есть ли уже запись в базе данных, и если нет, обработать некоторые вещи и в конечном итоге вставить ее, и просто прочитать данные из базы данных, если данные существуют. Я использую подкласс SQLiteOpenHelper для создания и получения перезаписываемого экземпляра SQLiteDatabase, который, как я думал, автоматически позаботился о создании таблицы, если она еще не существует (поскольку код для этого находится в onCreate (... ) метод).
Однако, когда таблица еще не существует, и первый метод, запущенный для объекта SQLiteDatabase, который у меня есть, является запросом к запросу (...), мой logcat показывает ошибку «I / Database (26434): sqlite return: error code = 1, msg = нет такой таблицы: appdata ", и, конечно же, таблица appdata не создается.
Есть идеи, почему?
Я ищу какой-либо метод для проверки, если таблица существует (потому что, если это не так, данные, безусловно, не в нем, и мне не нужно читать его, пока я пишу в него, который, кажется, создает таблицу правильно) или способ убедиться, что он создан и просто пуст во время первого вызова запроса (...)
РЕДАКТИРОВАТЬ
Это было опубликовано после двух ответов ниже:
Я думаю, что я, возможно, нашел проблему. По какой-то причине я решил, что для каждой таблицы должен быть создан отдельный SQLiteOpenHelper, хотя оба имеют доступ к одному и тому же файлу базы данных. Я думаю, что рефакторинг этого кода для использования только одного OpenHelper, и создание обеих таблиц внутри его onCreate может работать лучше ...
Ответы (12)
118 плюса
Попробуй это:
public boolean isTableExists(String tableName, boolean openDb) {
if(openDb) {
if(mDatabase == null || !mDatabase.isOpen()) {
mDatabase = getReadableDatabase();
}
if(!mDatabase.isReadOnly()) {
mDatabase.close();
mDatabase = getReadableDatabase();
}
}
String query = "select DISTINCT tbl_name from sqlite_master where tbl_name = '"+tableName+"'";
try (Cursor cursor = mDatabase.rawQuery(query, null)) {
if(cursor!=null) {
if(cursor.getCount()>0) {
return true;
}
}
return false;
}
}
Автор: Nikolay DS
Размещён: 22.10.2011 11:52
49 плюса
Я ничего не знаю об API Android SQLite, но если вы можете напрямую общаться с ним в SQL, вы можете сделать это:
create table if not exists mytable (col1 type, col2 type);
Который будет гарантировать, что таблица всегда создается и не выдает никаких ошибок, если она уже существовала.
Автор: chrisbtoo Размещён: 17.06.2010 04:4711 плюса
Вот что я сделал:
/* open database, if doesn't exist, create it */
SQLiteDatabase mDatabase = openOrCreateDatabase("exampleDb.db", SQLiteDatabase.CREATE_IF_NECESSARY,null);
Cursor c = null;
boolean tableExists = false;
/* get cursor on it */
try
{
c = mDatabase.query("tbl_example", null,
null, null, null, null, null);
tableExists = true;
}
catch (Exception e) {
/* fail */
Log.d(TAG, tblNameIn+" doesn't exist :(((");
}
return tableExists;
Автор: AndroidDebaser
Размещён: 21.09.2011 07:01
10 плюса
Хотя на этот вопрос уже есть много хороших ответов, я нашел другое решение, которое я считаю более простым. Окружите ваш запрос блоком try и следующим уловом:
catch (SQLiteException e){
if (e.getMessage().contains("no such table")){
Log.e(TAG, "Creating table " + TABLE_NAME + "because it doesn't exist!" );
// create table
// re-run query, etc.
}
}
Это сработало для меня!
Автор: robguinness Размещён: 15.08.2012 09:078 плюса
Да, оказывается, теория в моем редактировании была правильной: проблема, которая заставляла метод onCreate не запускаться, заключалась в том, что SQLiteOpenHelper
объекты должны ссылаться на базы данных, а не иметь отдельную для каждой таблицы. Упаковка обеих таблиц в одну SQLiteOpenHelper
решила проблему.
2 плюса
Вы упомянули, что создали класс, который расширяет SQLiteOpenHelper
и реализует onCreate
метод. Вы уверены, что выполняете все вызовы для получения базы данных с этим классом? Вы должны получать только SQLiteDatabase
объекты с помощью SQLiteOpenHelper#getWritableDatabase
и в getReadableDatabase
противном случае onCreate
метод не будет вызываться , когда это необходимо. Если вы делаете это уже, проверьте и посмотрите, SQLiteOpenHelper#onUpgrade
вызывается ли этот метод. Если это так, то номер версии базы данных был изменен в определенный момент времени, но таблица никогда не создавалась должным образом, когда это происходило.
Кроме того, вы можете принудительно восстановить базу данных, убедившись, что все подключения к ней закрыты, и вызывая, Context#deleteDatabase
а затем используя, SQLiteOpenHelper
чтобы дать вам новый объект БД.
2 плюса
// @param db, readable database from SQLiteOpenHelper
public boolean doesTableExist(SQLiteDatabase db, String tableName) {
Cursor cursor = db.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '" + tableName + "'", null);
if (cursor != null) {
if (cursor.getCount() > 0) {
cursor.close();
return true;
}
cursor.close();
}
return false;
}
- sqlite поддерживает таблицу sqlite_master, содержащую информацию обо всех таблицах и индексах в базе данных.
- Итак, здесь мы просто запускаем команду SELECT, мы получим курсор с номером 1, если таблица существует.
0 плюса
public boolean isTableExists(String tableName) {
boolean isExist = false;
Cursor cursor = db.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '" + tableName + "'", null);
if (cursor != null) {
if (cursor.getCount() > 0) {
isExist = true;
}
cursor.close();
}
return isExist;
}
Автор: Yogesh Rathi
Размещён: 03.09.2016 07:22
0 плюса
no such table exists: error
идет потому, что как только вы создаете базу данных с одной таблицей после этого, всякий раз, когда вы создаете таблицу в той же базе данных, это выдает эту ошибку
Чтобы устранить эту ошибку, вам нужно создать новую базу данных, и внутри метода onCreate () вы можете создать несколько таблиц в одной базе данных.
Автор: Megha Размещён: 07.09.2011 10:100 плюса
Важное условие - ЕСЛИ НЕ СУЩЕСТВУЕТ, чтобы проверить, что таблица уже существует или отсутствует в базе данных
любить...
String query = "CREATE TABLE IF NOT EXISTS " + TABLE_PLAYER_PHOTO + "("
+ KEY_PLAYER_ID + " TEXT,"
+ KEY_PLAYER_IMAGE + " TEXT)";
db.execSQL(query);
Автор: Pankaj Talaviya
Размещён: 27.08.2019 06:24
0 плюса
Я столкнулся с этим и справился с этим, попробовав поймать так просто, как я делаю то, что я хочу в таблице, если она не существует, приведет к ошибке, так что ловите ее исключениями и создайте ее :)
SQLiteDatabase db=this.getWritableDatabase();
try{
db.execSQL("INSERT INTO o_vacations SELECT * FROM vacations");
db.execSQL("DELETE FROM vacations");
}catch (SQLiteException e){
db.execSQL("create table o_vacations (id integer primary key ,name text ,vacation text,date text,MONTH text)");
db.execSQL("INSERT INTO o_vacations SELECT * FROM vacations");
db.execSQL("DELETE FROM vacations");
}
Автор: Aly Abdelaal
Размещён: 06.11.2019 06:58
-1 плюса
..... Toast t = Toast.makeText (context, "try ...", Toast.LENGTH_SHORT); t.show ();
Cursor callInitCheck = db.rawQuery("select count(*) from call", null);
Toast t2a = Toast.makeText(context, "count rows " + callInitCheck.getCount() , Toast.LENGTH_SHORT);
t2a.show();
callInitCheck.moveToNext();
if( Integer.parseInt( callInitCheck.getString(0)) == 0) // if no rows then do
{
// if empty then insert into call
.....
Автор: Srinath Ganesh Размещён: 08.03.2013 04:28Вопросы из категории :
- android Насколько хорошо отражает эмулятор Android Phone?
- android Как сохранить состояние активности Android с помощью сохранения состояния экземпляра?
- android Android: доступ к дочерним представлениям из ListView
- android Как вызвать SOAP веб-сервис на Android
- android Как вы форматируете дату и время в Android?
- android Android: Получение имени файла с камеры?
- database Двоичные данные в MySQL
- database Обменять уникальные индексированные значения столбцов в базе данных
- database Как работает индексация базы данных?
- database Как индексировать столбец базы данных
- database Насколько большой может быть база данных MySQL до того, как производительность начнет снижаться
- database Хранение изображений в БД - да или нет?
- sqlite Как вывести данные некоторых таблиц SQLite3?
- sqlite Как я могу объединить многие базы данных SQLite?
- sqlite Как узнать, уникален ли индекс SQLite? (С SQL)
- sqlite Легкая альтернатива Hibernate?
- sqlite Почему я не могу установить гем SQLite?
- sqlite Как я могу ссылаться на столбцы по их именам в python, вызывающем SQLite?