在下面的代码中,pathToNonDatabase
是一个简单文本文件的路径,而不是一个真正的 sqlite 数据库。我希望 sqlite3_open
检测到它,但它没有(db
不是 NULL
,并且 result
是 SQLITE_OK
)。那么,如何检测文件不是有效的 sqlite 数据库?
sqlite3 *db = NULL;
int result = sqlite3_open(pathToNonDatabase, &db);
if((NULL==db) || (result!=SQLITE_OK)) {
// invalid database
}
最佳答案
sqlite 延迟打开数据库。打开后立即做一些需要它是数据库的事情。
最好的可能是 pragma schema_version;
。
- 如果尚未创建数据库(例如,一个空文件),这将报告 0。在这种情况下,使用(并运行
CREATE TABLE
等) 是安全的
- 如果数据库已创建,它将返回架构经历了多少次修订。这个值可能并不有趣,但它不为零才是。
- 如果文件存在但不是数据库(或空文件),您将收到错误消息。
如果您想进行更彻底的检查,可以使用 pragma quick_check;
。这是一个轻量级的完整性检查,它跳过检查表的内容是否与索引对齐。它仍然可能非常慢。
避免integrity_check
。它不仅会检查每一页,还会根据索引验证表的内容。这在大型数据库上肯定是冰川。
关于database - 如何判断sqlite数据库文件是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3888529/