美文网首页
SQLite 数据库文件检测 (是否是标准的 SQLite 数据

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

作者: ZHK1024 | 来源:发表于2019-06-22 12:32 被阅读0次

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

检测用户选择的文件是否是标准的 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 文件是经过加密的, 那就只能通过尝试打开数据库文件来判断了. 没有更好的判断方法.

相关文章

网友评论

      本文标题:SQLite 数据库文件检测 (是否是标准的 SQLite 数据

      本文链接:https://www.haomeiwen.com/subject/iibmqctx.html