我如何可靠地在SQLite中检查特定的用户表是否存在?

我并不是要求使用不可靠的方法,比如检查表上的“select *”是否返回错误(这是一个好主意吗?)

原因如下:

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

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

我是否应该采取其他路径来表示已经创建了相关的表-例如,通过在磁盘上的程序初始化/设置文件中创建/放置/设置某个标志?

或者我的方法有意义吗?


当前回答

我现在在c#中发现的最可靠的方法是使用最新的SQLite -net-pcl nuget包(1.5.231),它使用SQLite 3,如下所示:

var result = database.GetTableInfo(tableName);
if ((result == null) || (result.Count == 0))
{
    database.CreateTable<T>(CreateFlags.AllImplicit);
}

其他回答

在swift的数据库中,表是否存在

func tableExists(_ tableName:String) -> Bool {
        sqlStatement = "SELECT name FROM sqlite_master WHERE type='table' AND name='\(tableName)'"
        if sqlite3_prepare_v2(database, sqlStatement,-1, &compiledStatement, nil) == SQLITE_OK {
            if sqlite3_step(compiledStatement) == SQLITE_ROW {
                return true
            }
            else {
                return false
            }
        }
        else {
            return false
        }
            sqlite3_finalize(compiledStatement)
    }

这是我使用的函数:

给定SQLDatabase Object = db

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

Use:

PRAGMA table_info(your_table_name)

如果结果表为空,则your_table_name不存在。

文档:

编译指示schema.table_info(表名); 这个pragma为命名表中的每一列返回一行。结果集中的列包括列名、数据类型、列是否可以为NULL以及列的默认值。对于不属于主键的列,结果集中的“pk”列为零;对于属于主键的列,结果集中的“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

我想我要对这个讨论发表我的意见,即使这是一个相当老的问题。 如果表存在,该查询返回标量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

我现在在c#中发现的最可靠的方法是使用最新的SQLite -net-pcl nuget包(1.5.231),它使用SQLite 3,如下所示:

var result = database.GetTableInfo(tableName);
if ((result == null) || (result.Count == 0))
{
    database.CreateTable<T>(CreateFlags.AllImplicit);
}