sqlite - 怎么检查SQLite的表是否存在?

  显示原文与译文双语对照的内容

在SQLite中,是否包含特定用户表 exists, 。如何,可靠地,检查?

我不是在询问不可靠的方法,比如检查"选择 *" on是否返回了一个错误( 这甚至是一个好主意? ) 。

原因如下:

在我的程序中,如果它们不存在,我需要创建并填充一些表。

如果它们已经存在,我需要更新一些表。

something,或者软盘上有问题我应该采取其他路径来取代,以表示该表拥有由 creating/putting/setting 已经创造出来了- 举个例子来说吧,一定的标志在我的程序的初始化/设置文件?

或者我的方法有意义?

时间:

如果你使用的是 SQLite 3.3 +,那么你可以轻松地创建一个表:


create table if not exists TableName (col1 typ1,.. ., colN typN)

同样,只有当表存在时才能删除该表,使用:


drop table if exists TableName

一个变体是使用选择 COUNT(*) 而不是选择名称,i.e.


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

如果该表不存在,则返回 0,如果不存在则返回 1. 这可能在你的编程中有用,因为数值结果更快/更容易处理。 下面展示了如何在Android中使用 SQLite数据库,光标,rawQuery和参数来实现这一点。


boolean isTableExists(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())
 {
 return false;
 }
 int count = cursor.getInt(0);
 cursor.close();
 return count> 0;
}

如果表存在,这里代码返回 1,如果表不存在则返回 0


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

SQLite表名不区分大小写,但比较在默认情况下区分大小写。 为了在所有情况下都能正常工作,你需要添加 COLLATE NOCASE


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

注意,要检查临时数据库中是否存在表,你必须使用 sqlite_temp_master 而不是 sqlite_master:


SELECT name FROM sqlite_temp_master WHERE type='table' AND name='table_name';

...