Androidデータベースファイルのコピー
1757 ワード
Android開発では、必ずしもデータベースを作成してデータを挿入するプロセスではない場合があります.例えば、ビッグデータ量リソースの検索機能を提供する必要があります.番号帰属地、都市リスト、ip帰属地など.このときキー・データベースの場合、データベースにデータを1本1本insert送信すると、時間がかかるだけでなく、リソースが占有され、エラーがインポートされることもあります.最良の方法はデータベースを構築し、データをinsertし、beifen.dbファイルはraw(ない場合はresディレクトリの下に作成)ディレクトリの下に配置されます.データベースの作成時に、そのファイルをdatabasesディレクトリの下に直接コピーします:DATABASES_DIR="/data/data/yourpackagedir/databases", DATABASE_NAME="beifen.db".詳細は、コードを参照してください.
それでも不安な場合は、ContentProviderのquery(一般的にデータベースをコピーするのはクエリー用)を実行するときに、コピー検出を1回行うことができます.
ファイルがない場合は、コピー、ある場合はコピーしません.
public static synchronized CityDBHelper getInstance(Context context) {
copyDatabaseFile(context, true);
if(mDatabase == null){
mDatabase = new CityDBHelper(context);
}
return mDatabase;
}
public static void copyDatabaseFile(Context context, boolean isfored) {
Log.v(TAG, "--------------------------------copyDatabaseFile-");
File dir = new File(DATABASES_DIR);
if (!dir.exists() || isfored) {
try {
dir.mkdir();
} catch (Exception e) {
e.printStackTrace();
}
}
File dest = new File(dir, DATABASE_NAME);
if(dest.exists() && !isfored){
return ;
}
try {
if(dest.exists()){
dest.delete();
}
dest.createNewFile();
InputStream in = context.getResources().openRawResource(R.raw.beifen);
int size = in.available();
byte buf[] = new byte[size];
in.read(buf);
in.close();
FileOutputStream out = new FileOutputStream(dest);
out.write(buf);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
それでも不安な場合は、ContentProviderのquery(一般的にデータベースをコピーするのはクエリー用)を実行するときに、コピー検出を1回行うことができます.
copyDatabaseFile(context, false)
ファイルがない場合は、コピー、ある場合はコピーしません.