我如何可靠地检查 SQLite,是否存在特定的用户表?
我不是要求不可靠的方法,比如检查表上的 “select *” 是否返回错误(这是一个好主意吗?)。
原因是这样的:
在我的程序中,我需要创建并填充一些表,如果它们不存在的话。
如果它们已经存在,我需要更新一些表。
我是否应该采取其他路径来表示已经创建了相关表格 - 例如,通过在磁盘上的程序初始化 / 设置文件中创建 / 放置 / 设置某个标志或其他东西?
或者我的方法有意义吗?
我错过了 FAQ 条目。
无论如何,为了将来参考,完整的查询是:
SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';
其中{table_name}
是要检查的表的名称。
文档部分供参考: 数据库文件格式。 2.6。存储 SQL 数据库模式
如果您使用的是 SQLite 版本 3.3+,则可以轻松创建一个表格:
create table if not exists TableName (col1 typ1, ..., colN typN)
以同样的方式,您可以通过使用以下表来删除表:
drop table if exists TableName
一种变化是使用 SELECT COUNT(*)而不是 SELECT NAME,即
SELECT count(*) FROM sqlite_master WHERE type='table' AND name='table_name';
如果表不存在,则返回 0,否则返回 1。这可能对您的编程很有用,因为数字结果更快 / 更容易处理。下面说明如何使用 SQLiteDatabase,Cursor,带参数的 rawQuery 在 Android 中执行此操作。
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;
}