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

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

原因如下:

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

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

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

或者我的方法有意义吗?


当前回答

如果你正在使用fmdb,我认为你可以导入FMDatabaseAdditions并使用bool函数:

[yourfmdbDatabase tableExists:tableName].

其他回答

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

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

如果你正在使用fmdb,我认为你可以导入FMDatabaseAdditions并使用bool函数:

[yourfmdbDatabase tableExists:tableName].

如果你处理Big Table,我用Python和Sqlite做了一个简单的hack,你可以用任何其他语言做出类似的想法

步骤1:不要在create table命令中使用(如果不存在)

您可能知道,如果您之前已经创建了这个表,并且想要重新创建它,那么运行这个命令将会有一个异常,但这将引导我们进入第二步。

步骤2:使用try和except(或其他语言的try和catch)来处理最后一个异常

在这里,如果您之前没有创建表,则try case将继续执行,但如果您已经创建了,则可以将do your process置于except case,您将知道您已经创建了表。

代码如下:

def create_table():
    con = sqlite3.connect("lists.db")
    cur = con.cursor()
    try:
        cur.execute('''CREATE TABLE UNSELECTED(
        ID INTEGER PRIMARY KEY)''')
        print('the table is created Now')

    except sqlite3.OperationalError:
        print('you already created the table before')
    con.commit()
    cur.close()

您可以编写以下查询来检查表的存在性。

SELECT name FROM sqlite_master WHERE name='table_name'

这里的table_name是你创建的表名。例如

 CREATE TABLE IF NOT EXISTS country(country_id INTEGER PRIMARY KEY AUTOINCREMENT, country_code TEXT, country_name TEXT)"

并检查

  SELECT name FROM sqlite_master WHERE name='country'

你可以使用一个简单的方法,我在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; }

}