Androidデータベースファイルのコピー

1757 ワード

Android開発では、必ずしもデータベースを作成してデータを挿入するプロセスではない場合があります.例えば、ビッグデータ量リソースの検索機能を提供する必要があります.番号帰属地、都市リスト、ip帰属地など.このときキー・データベースの場合、データベースにデータを1本1本insert送信すると、時間がかかるだけでなく、リソースが占有され、エラーがインポートされることもあります.最良の方法はデータベースを構築し、データをinsertし、beifen.dbファイルはraw(ない場合はresディレクトリの下に作成)ディレクトリの下に配置されます.データベースの作成時に、そのファイルをdatabasesディレクトリの下に直接コピーします:DATABASES_DIR="/data/data/yourpackagedir/databases", DATABASE_NAME="beifen.db".詳細は、コードを参照してください.
    
    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)

ファイルがない場合は、コピー、ある場合はコピーしません.