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

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

原因如下:

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

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

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

或者我的方法有意义吗?


当前回答

我想补充Diego Vélez关于PRAGMA声明的回答。

从https://sqlite.org/pragma.html我们可以得到一些有用的函数,可以返回关于我们数据库的信息。 在此,我引用以下内容:

例如,索引中有关列的信息可以使用index_info pragma读取,如下所示: 编译指示index_info(“idx52”); 或者,可以使用以下方法读取相同的内容: SELECT * FROM pragma_index_info('idx52'); 表值函数格式的优点是查询可以只返回PRAGMA列的一个子集,可以包含WHERE子句,可以使用聚合函数,并且表值函数可以只是连接中的几个数据源之一……

Diego的回答给了PRAGMA table_info(table_name)一个选项,但这在您的其他查询中没有多大用处。

所以,要回答OPs问题并改进diego的回答,你可以做

SELECT * FROM pragma_table_info('table_name');

或者更好,

SELECT name FROM pragma_table_list('table_name');

如果你想模仿poorluzer投票最多的答案。

其他回答

你可以使用一个简单的方法,我在c#和Xamarin中使用这个方法,

public class LoginService : ILoginService
{
    private SQLiteConnection dbconn; 
}

在登录服务类中,我有许多方法用于访问sqlite中的数据,我将数据存储到一个表中,并将登录页面 它只在用户未登录时显示。

为了这个目的,我只需要知道表是否存在,在这种情况下,如果它存在,那是因为它有数据

public int ExisteSesion()
    {
        var rs = dbconn.GetTableInfo("Sesion");
        return rs.Count;
    }

如果表不存在,它只返回0,如果表存在,那是因为它有数据,它返回它的总行数。

在模型中,我指定了表必须接收的名称,以确保其正确操作。

    [Table("Sesion")]
public class Sesion
{
    [PrimaryKey]
    public int Id { get; set; }
    public string Token { get; set; }
    public string Usuario { get; set; }

}

您还可以使用db元数据来检查表是否存在。

DatabaseMetaData md = connection.getMetaData();
ResultSet resultSet = md.getTables(null, null, tableName, null);
if (resultSet.next()) {
    return true;
}

如果你使用SQLite 3.3+版本,你可以很容易地创建一个表:

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

以同样的方式,你可以删除一个表,如果它存在,使用:

drop table if exists TableName

你可以试试:

SELECT name FROM sqlite_master WHERE name='table_name'

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

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