Как проверить, существует ли таблица в базе данных Android SQLite? - PullRequest
82 голосов
/ 17 июня 2010

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

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

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

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

EDIT Это было опубликовано после двух ответов ниже:Я думаю, что, возможно, нашел проблему.По какой-то причине я решил, что для каждой таблицы должен быть создан отдельный SQLiteOpenHelper, хотя оба имеют доступ к одному и тому же файлу базы данных.Я думаю, что рефакторинг этого кода для использования только одного OpenHelper, и создание обеих таблиц внутри его onCreate может работать лучше ...

Ответы [ 10 ]

118 голосов
/ 23 октября 2011

Попробуйте это:

public boolean isTableExists(String tableName, boolean openDb) {
    if(openDb) {
        if(mDatabase == null || !mDatabase.isOpen()) {
            mDatabase = getReadableDatabase();
        }

        if(!mDatabase.isReadOnly()) {
            mDatabase.close();
            mDatabase = getReadableDatabase();
        }
    }

    Cursor cursor = mDatabase.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;
}
47 голосов
/ 17 июня 2010

Я ничего не знаю об API Android SQLite, но если вы можете напрямую общаться с ним в SQL, вы можете сделать это:

create table if not exists mytable (col1 type, col2 type);

Который будет гарантировать, что таблица всегда создается и не выдает никаких ошибок, если она уже существовала.

11 голосов
/ 21 сентября 2011

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

/* 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;
10 голосов
/ 15 августа 2012

Хотя на этот вопрос уже есть много хороших ответов, я нашел другое решение, которое я считаю более простым. Окружите ваш запрос блоком 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.
    }
}

У меня это сработало!

8 голосов
/ 17 июня 2010

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

2 голосов
/ 11 июля 2015
 // @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, если таблицасуществует.
2 голосов
/ 17 июня 2010

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

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

0 голосов
/ 03 сентября 2016
 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;
}
0 голосов
/ 08 марта 2013

..... Toast t = Toast.makeText (context, "try ...", Toast.LENGTH_SHORT); t.show (); * +1001 *

    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

.....

0 голосов
/ 07 сентября 2011

no such table exists: error идет, потому что как только вы создаете базу данных с одной таблицей после этого, всякий раз, когда вы создаете таблицу в той же базе данных, она выдает эту ошибку.

Чтобы решить эту ошибку, вы должны создать новую базу данных и внутриМетод onCreate () позволяет создать несколько таблиц в одной базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...