我如何可靠地在SQLite中检查特定的用户表是否存在?
我并不是要求使用不可靠的方法,比如检查表上的“select *”是否返回错误(这是一个好主意吗?)
原因如下:
在我的程序中,我需要创建并填充一些表,如果它们还不存在的话。
如果它们已经存在,我需要更新一些表。
我是否应该采取其他路径来表示已经创建了相关的表-例如,通过在磁盘上的程序初始化/设置文件中创建/放置/设置某个标志?
或者我的方法有意义吗?
我如何可靠地在SQLite中检查特定的用户表是否存在?
我并不是要求使用不可靠的方法,比如检查表上的“select *”是否返回错误(这是一个好主意吗?)
原因如下:
在我的程序中,我需要创建并填充一些表,如果它们还不存在的话。
如果它们已经存在,我需要更新一些表。
我是否应该采取其他路径来表示已经创建了相关的表-例如,通过在磁盘上的程序初始化/设置文件中创建/放置/设置某个标志?
或者我的方法有意义吗?
当前回答
这是我使用的函数:
给定SQLDatabase Object = db
public boolean exists(String table) {
try {
db.query("SELECT * FROM " + table);
return true;
} catch (SQLException e) {
return false;
}
}
其他回答
如果你使用SQLite 3.3+版本,你可以很容易地创建一个表:
create table if not exists TableName (col1 typ1, ..., colN typN)
以同样的方式,你可以删除一个表,如果它存在,使用:
drop table if exists TableName
R DBI包中的函数dbExistsTable()为R程序员简化了这个问题。请看下面的例子:
library(DBI)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
# let us check if table iris exists in the database
dbExistsTable(con, "iris")
### returns FALSE
# now let us create the table iris below,
dbCreateTable(con, "iris", iris)
# Again let us check if the table iris exists in the database,
dbExistsTable(con, "iris")
### returns TRUE
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
你可以使用一个简单的方法,我在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; }
}
我错过了FAQ条目。
不管怎样,为了将来的参考,完整的查询是:
SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';
其中{table_name}是要检查的表的名称。
参考文档部分:数据库文件格式。SQL数据库模式的存储
这将返回指定名称的表列表;也就是说,游标的计数将为0(不存在)或1(确实存在)