таблицы - sqlite руководство




Как проверить SQLite, существует ли таблица? (12)

Как я, надежно , проверяю SQLite, существует ли конкретная таблица пользователей?

Я не прошу о ненадежных способах проверки, если «select *» в таблице возвратил ошибку или нет (это даже хорошая идея?).

Причина такова:

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

Если они уже существуют, мне нужно обновить некоторые таблицы.

Должен ли я взять какой-то другой путь вместо этого, чтобы сигнализировать, что указанные таблицы уже созданы, например, путем создания / установки / установки определенного флага в файле инициализации / настройки программы на диске или что-то еще?

Или мой подход имеет смысл?


Вариантом будет использование SELECT COUNT (*) вместо SELECT NAME, т.е.

SELECT count(*) FROM sqlite_master WHERE type='table' AND name='table_name';

Это вернет 0, если таблица не существует, 1, если это произойдет. Это, вероятно, полезно в вашем программировании, поскольку числовой результат выполняется быстрее / проще. Ниже показано, как вы это сделаете в Android, используя SQLiteDatabase, Cursor, rawQuery с параметрами.

boolean tableExists(SQLiteDatabase db, String tableName)
{
    if (tableName == null || db == null || !db.isOpen())
    {
        return false;
    }
    Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM sqlite_master WHERE type = ? AND name = ?", new String[] {"table", tableName});
    if (!cursor.moveToFirst())
    {
        cursor.close();
        return false;
    }
    int count = cursor.getInt(0);
    cursor.close();
    return count > 0;
}

Вот функция, которую я использовал:

Учитывая объект SQLDatabase Object = db

public boolean exists(String table) {
    try {
         db.query("SELECT * FROM " + table);
         return true;
    } catch (SQLException e) {
         return false;
    }
}

Вы можете попробовать:

SELECT name FROM sqlite_master WHERE name='table_name'

Если вы используете fmdb , я думаю, вы можете просто импортировать FMDatabaseAdditions и использовать функцию bool:

[yourfmdbDatabase tableExists:tableName].

Если вы получаете ошибку «таблица уже существует», внесите изменения в строку SQL, как показано ниже:

CREATE table IF NOT EXISTS table_name (para1,para2);

Таким образом, вы можете избежать исключений.


Имена таблиц SQLite нечувствительны к регистру, но сравнение по умолчанию чувствительно к регистру. Для правильной работы во всех случаях вам необходимо добавить COLLATE NOCASE .

SELECT name FROM sqlite_master WHERE type='table' AND name='table_name' COLLATE NOCASE

Использование:

PRAGMA table_info(your_table_name)

Если результирующая таблица пуста, your_table_name не существует.

Документация:

PRAGMA schema.table_info (имя-таблицы);

Эта прагма возвращает одну строку для каждого столбца в названной таблице. Столбцы в результирующем наборе включают имя столбца, тип данных, может ли столбец NULL или значение по умолчанию для столбца. Столбец «pk» в результирующем наборе равен нулю для столбцов, которые не являются частью первичного ключа, и является индексом столбца в первичном ключе для столбцов, которые являются частью первичного ключа.

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

Пример вывода:

cid|name|type|notnull|dflt_value|pk
0|id|INTEGER|0||1
1|json|JSON|0||0
2|name|TEXT|0||0

Используйте этот код:

SELECT name FROM sqlite_master WHERE type='table' AND name='yourTableName';

Если количество возвращаемых массивов равно 1, это означает, что таблица существует. Иначе этого не существует.


Следующий код возвращает 1, если таблица существует или 0, если таблица не существует.

SELECT CASE WHEN tbl_name = "name" THEN 1 ELSE 0 END FROM sqlite_master WHERE tbl_name = "name" AND type = "table"

Смотрите this :

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;

Я думал, что поставил свои 2 цента на эту дискуссию, даже если она довольно старая. Этот запрос возвращает скаляр 1, если таблица существует и 0 в противном случае.

select 
    case when exists 
        (select 1 from sqlite_master WHERE type='table' and name = 'your_table') 
        then 1 
        else 0 
    end as TableExists





sqlite