SQLite 數(shù)據(jù)庫(kù)文件檢測(cè) (是否是標(biāo)準(zhǔn)的 SQLite 數(shù)據(jù)庫(kù)文件)

開(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)有更好的判斷方法.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,957評(píng)論 0 9
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 6,323評(píng)論 0 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,641評(píng)論 1 32
  • 什么是SQLite?數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的步驟 ●SQLite是一款輕型的嵌入式數(shù)據(jù)庫(kù),它占用資源非常的低,在嵌入式設(shè)備...
    飛行的貓閱讀 2,601評(píng)論 1 7
  • -----------MySQL 連接方式----------- MySQL Connector/ODBC 2.5...
    BugMyGod閱讀 2,738評(píng)論 2 8

友情鏈接更多精彩內(nèi)容