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