我如何可靠地在SQLite中检查特定的用户表是否存在?
我并不是要求使用不可靠的方法,比如检查表上的“select *”是否返回错误(这是一个好主意吗?)
原因如下:
在我的程序中,我需要创建并填充一些表,如果它们还不存在的话。
如果它们已经存在,我需要更新一些表。
我是否应该采取其他路径来表示已经创建了相关的表-例如,通过在磁盘上的程序初始化/设置文件中创建/放置/设置某个标志?
或者我的方法有意义吗?
我如何可靠地在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);
}
其他回答
你可以使用一个简单的方法,我在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; }
}
如果你正在使用fmdb,我认为你可以导入FMDatabaseAdditions并使用bool函数:
[yourfmdbDatabase tableExists:tableName].
你可以试试:
SELECT name FROM sqlite_master WHERE name='table_name'
SQLite表名不区分大小写,但是默认情况下比较是区分大小写的。为了在所有情况下都能正常工作,需要添加COLLATE NOCASE。
SELECT name FROM sqlite_master WHERE type='table' AND name='table_name' COLLATE NOCASE
在我看来,使用一个简单的SELECT查询是非常可靠的。最重要的是,它可以检查表是否存在于许多不同的数据库类型(SQLite / MySQL)。
SELECT 1 FROM table;
当您可以使用其他可靠的机制来确定查询是否成功时(例如,您可以通过Qt中的QSqlQuery查询数据库),这是有意义的。