開(kāi)發(fā)需求總是千奇百怪, 最近有個(gè)需求:
檢測(cè)用戶選擇的文件是否是標(biāo)準(zhǔn)的
SQLite數(shù)據(jù)庫(kù)文件.
畢竟總有一部分用戶會(huì)認(rèn)為把文件擴(kuò)展名改成 .PNG 就是圖片, 改成 .DB 就是數(shù)據(jù)庫(kù). 然后過(guò)來(lái)講程序有 BUG ??.
畢竟當(dāng)年我也干過(guò)把網(wǎng)吧游戲快捷方式拷貝回家的經(jīng)歷???♀?, 也不能怪用戶. 能用代碼避免的問(wèn)題就應(yīng)該避免.
有 2 種檢測(cè)方法
第一種: 通過(guò)執(zhí)行 SQL 來(lái)判斷.
pragma schema_version;
如果是非標(biāo)準(zhǔn)的 SQLite 數(shù)據(jù)庫(kù)文件, 你會(huì)得到報(bào)錯(cuò)信息. 這種比較被動(dòng), 個(gè)人不太喜歡(一般執(zhí)行 SQL 還要搞個(gè)異步, 麻煩).
第二種: 通過(guò)文件頭判斷.
有很多種文件都是以文件類型的字符串作為頭部開(kāi)始的, SQLite 文件也不例外.
標(biāo)準(zhǔn)的 SQLite 3 數(shù)據(jù)庫(kù)文件是以 SQLite format 3 字符串開(kāi)頭的.
因此判斷文件開(kāi)頭是否是指定的字符串即可 (個(gè)人習(xí)慣用包含來(lái)判斷??).
放上代碼:
/**
判斷指定路徑的文件是否是標(biāo)準(zhǔn)的 SQLite 3 數(shù)據(jù)庫(kù)文件
@param path 文件路徑
@return 判斷結(jié)果
*/
- (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;
}
另外還有一個(gè)情況, 如果 SQLite 文件是經(jīng)過(guò)加密的, 那就只能通過(guò)嘗試打開(kāi)數(shù)據(jù)庫(kù)文件來(lái)判斷了. 沒(méi)有更好的判斷方法.