2016-09-19 8 views
4

ファイル(拡張子が不明)が有効なSQLiteデータベースであるかどうかを確認する必要があります。 dbファイルはsdカードに保存されています。私は自分のアプリケーションでデータベースをインポートする必要があります。しかし、ユーザが任意の拡張子を持つデータベースと同じ名前でファイルを作成した場合、ファイルは名前だけを検索するため、コードによって引き続き受け入れられます。 メモリカードに保存されているsqlite dbの有効性を確認する簡単な方法はありますか? 私はこのコードを使用しましたが、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を提供するヘッダーが含まれています。

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; 
    } 
} 
:あなたのファイルは、その最初の16バイトで、その値が含まれているのであれば、あなたがチェックすることができ SQLiteのフォーマット3 0000 \

:具体的には、すべてのSQLiteのデータベースファイルは、常にそれに最初の16バイト値 をだました

関連する問題