Как проверить, существует ли таблица в базе данных Android SQLite?

android database sqlite

114775 просмотра

12 ответа

У меня есть приложение для Android, которое должно проверить, есть ли уже запись в базе данных, и если нет, обработать некоторые вещи и в конечном итоге вставить ее, и просто прочитать данные из базы данных, если данные существуют. Я использую подкласс SQLiteOpenHelper для создания и получения перезаписываемого экземпляра SQLiteDatabase, который, как я думал, автоматически позаботился о создании таблицы, если она еще не существует (поскольку код для этого находится в onCreate (... ) метод).

Однако, когда таблица еще не существует, и первый метод, запущенный для объекта SQLiteDatabase, который у меня есть, является запросом к запросу (...), мой logcat показывает ошибку «I / Database (26434): sqlite return: error code = 1, msg = нет такой таблицы: appdata ", и, конечно же, таблица appdata не создается.

Есть идеи, почему?

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

РЕДАКТИРОВАТЬ
Это было опубликовано после двух ответов ниже:
Я думаю, что я, возможно, нашел проблему. По какой-то причине я решил, что для каждой таблицы должен быть создан отдельный SQLiteOpenHelper, хотя оба имеют доступ к одному и тому же файлу базы данных. Я думаю, что рефакторинг этого кода для использования только одного OpenHelper, и создание обеих таблиц внутри его onCreate может работать лучше ...

Автор: camperdave Источник Размещён: 12.11.2019 09:46

Ответы (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:47

11 плюса

Вот что я сделал:

/* 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:07

8 плюса

Решение

Да, оказывается, теория в моем редактировании была правильной: проблема, которая заставляла метод onCreate не запускаться, заключалась в том, что SQLiteOpenHelperобъекты должны ссылаться на базы данных, а не иметь отдельную для каждой таблицы. Упаковка обеих таблиц в одну SQLiteOpenHelperрешила проблему.

Автор: camperdave Размещён: 17.06.2010 06:11

2 плюса

Вы упомянули, что создали класс, который расширяет SQLiteOpenHelperи реализует onCreateметод. Вы уверены, что выполняете все вызовы для получения базы данных с этим классом? Вы должны получать только SQLiteDatabaseобъекты с помощью SQLiteOpenHelper#getWritableDatabaseи в getReadableDatabaseпротивном случае onCreateметод не будет вызываться , когда это необходимо. Если вы делаете это уже, проверьте и посмотрите, SQLiteOpenHelper#onUpgradeвызывается ли этот метод. Если это так, то номер версии базы данных был изменен в определенный момент времени, но таблица никогда не создавалась должным образом, когда это происходило.

Кроме того, вы можете принудительно восстановить базу данных, убедившись, что все подключения к ней закрыты, и вызывая, Context#deleteDatabaseа затем используя, SQLiteOpenHelperчтобы дать вам новый объект БД.

Автор: Rich Schuler Размещён: 17.06.2010 05:32

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, если таблица существует.
Автор: Akshansh singh Размещён: 11.07.2015 02:13

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:10

0 плюса

Важное условие - ЕСЛИ НЕ СУЩЕСТВУЕТ, чтобы проверить, что таблица уже существует или отсутствует в базе данных

любить...

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
Вопросы из категории :
32x32