我如何可靠地检查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; }
你可以尝试:
SELECT name FROM sqlite_master WHERE name='table_name'
如果您收到"表已存在"错误,请在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(table-name);
该pragma为命名表中的每列返回一行.结果集中的列包括列名,数据类型,列是否可以为NULL以及列的默认值.对于不属于主键的列,结果集中的"pk"列为零,并且是主键中作为主键一部分的列的列的索引.
table_info pragma中指定的表也可以是视图.
示例输出:
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' ORDER BY name;
如果你正在使用fmdb,我想你可以导入FMDatabaseAdditions并使用bool函数:
[yourfmdbDatabase tableExists:tableName].
如果表存在,则以下代码返回1;如果表不存在,则返回0.
SELECT CASE WHEN tbl_name = "name" THEN 1 ELSE 0 END FROM sqlite_master WHERE tbl_name = "name" AND type = "table"
请注意,要检查TEMP数据库中是否存在表,必须使用sqlite_temp_master
而不是sqlite_master
:
SELECT name FROM sqlite_temp_master WHERE type='table' AND name='table_name';
这是我使用的功能:
给定一个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 type='table' AND name='yourTableName';
如果返回的数组计数等于1,则表示该表存在.否则它不存在.