2016-09-19 94 views
4

我需要檢查一個文件(帶有未知擴展名)是否是一個有效的SQLite數據庫。 db文件存儲在SD卡上。我需要在我的應用程序中導入數據庫。但是,如果用戶使用任何擴展名與數據庫的名稱相同的名稱創建文件,則代碼仍然會接受該文件,因爲它僅搜索名稱。 有沒有一種快速的方法來檢查存儲卡上存儲的sqlite數據庫的有效性。 我使用了這段代碼,但它仍然接受與db相同名稱的任意文件。Android:檢查一個文件是否是一個有效的SQLite數據庫

String path = Environment.getExternalStorageDirectory().getPath() + "/FOLDER/DB_FILE"; 

     SQLiteDatabase database; 
     database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY); 
     if (database == null) { 
      Toast.makeText(getApplicationContext(), "Error: Incorrect/Corrupted File", Toast.LENGTH_SHORT).show(); 
      return; 
     } else {Proceed with code here} 
+1

嘗試在數據庫上執行實際查詢,而不僅僅是打開它。 – CommonsWare

+0

不明確。請冷靜下來,收集你的想法。嘗試打開文件。最終趕上例外,以防它不是一個有效的文件。正如@CommonsWare建議的,嘗試對它進行操作,即使是簡單的查詢。 –

+0

@Rotwang使用實際的查詢工作就像CommonsWare說..謝謝你。但是,仍然爲什麼,只是打開數據庫,並檢查它是否爲空,不起作用?仍然困惑.. –

回答

4

SQLite數據庫文件包含一個標頭,它提供了一些useful information。 特別是,每個SQLite數據庫文件始終在它的第一個16個字節的值:SQLite的格式3 \ 0000

所以,你可以檢查您的文件包含在它的第一個16個字節的值:

public boolean isValidSQLite(String dbPath) { 
    File file = new File(dbPath); 

    if (!file.exists() || !file.canRead()) { 
     return false; 
    } 

    try { 
     FileReader fr = new FileReader(file); 
     char[] buffer = new char[16]; 

     fr.read(buffer, 0, 16); 
     String str = String.valueOf(buffer); 
     fr.close(); 

     return str.equals("SQLite format 3\u0000"); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 
相關問題