SQLite 数据库文件检测 (是否是标准的 SQLite 数据库文件)

开发需求总是千奇百怪, 最近有个需求:

检测用户选择的文件是否是标准的 SQLite 数据库文件.

毕竟总有一部分用户会认为把文件扩展名改成 .PNG 就是图片, 改成 .DB 就是数据库. 然后过来讲程序有 BUG 😂.
毕竟当年我也干过把网吧游戏快捷方式拷贝回家的经历🤦‍♀️, 也不能怪用户. 能用代码避免的问题就应该避免.

有 2 种检测方法

第一种: 通过执行 SQL 来判断.

pragma schema_version;

如果是非标准的 SQLite 数据库文件, 你会得到报错信息. 这种比较被动, 个人不太喜欢(一般执行 SQL 还要搞个异步, 麻烦).

第二种: 通过文件头判断.
有很多种文件都是以文件类型的字符串作为头部开始的, SQLite 文件也不例外.
标准的 SQLite 3 数据库文件是以 SQLite format 3 字符串开头的.
因此判断文件开头是否是指定的字符串即可 (个人习惯用包含来判断😷).

放上代码:

/**
 判断指定路径的文件是否是标准的 SQLite 3 数据库文件

 @param path 文件路径
 @return 判断结果
 */
- (BOOL)isSQLiteFileFormat:(NSString *)path {
    NSData *data = [NSData dataWithContentsOfFile:path];
    if (data.length >= 16) {
        NSData *headData = [data subdataWithRange:NSMakeRange(0, 16)];
        NSString *string = [[NSString alloc] initWithData:headData encoding:NSASCIIStringEncoding];
        return [string containsString:@"SQLite format 3"];
    }
    return NO;
}

另外还有一个情况, 如果 SQLite 文件是经过加密的, 那就只能通过尝试打开数据库文件来判断了. 没有更好的判断方法.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,477评论 0 9
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,876评论 0 10
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • 什么是SQLite?数据库存储数据的步骤 ●SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备...
    飞行的猫阅读 2,550评论 1 7
  • -----------MySQL 连接方式----------- MySQL Connector/ODBC 2.5...
    BugMyGod阅读 2,690评论 2 8