import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import android.app.Activity; import android.content.Context; import android.content.res.AssetManager; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; import android.os.Bundle; import android.util.Log; public class KenpoActivity extends Activity { private String DB_PATH; private String DB_NAME; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("kenpoActivity", "onCreate()"); setContentView(R.layout.minpo); DB_PATH = "/data/data/" + this.getPackageName() + "/databases/";// DB_NAME = "ropou.db"; DatabaseHelper dbHelper = new DatabaseHelper(this, DB_NAME, null, 1); //データベースが在るか確認する boolean DatabaseCheck = databaseExists(DB_PATH,DB_NAME); if(DatabaseCheck){ Log.i("kenpoActivity", "データベース在り" ); }else{ //データベースが無い場合assetsフォルダのデータベースをコピー Log.i("kenpoActivity", "データベース無し" ); //空のデータベース作成 dbHelper.createEmptyDataBase(); //データベースコピー //databaseCopy(DB_PATH,DB_NAME); //データベースが圧縮されている場合 databaseUnZipCopy(DB_PATH,DB_NAME); } } /* * データベースの存在確認 */ private boolean databaseExists(String path, String name) { // TODO 自動生成されたメソッド・スタブ SQLiteDatabase checkDb = null; try { String dbPath = path + DB_NAME; checkDb = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { // データベースはまだ存在していない Log.i("kenpoActivity", "データベースが無い"); } if (checkDb != null) { Log.i("kenpoActivity", "データベースが在る"); checkDb.close(); } return checkDb != null ? true : false; } /* * データベースのコピー */ private void databaseCopy(String path, String name) { // TODO 自動生成されたメソッド・スタブ try { InputStream mInput = this.getAssets().open( name );//assetsフォルダのデータベース // デフォルトのデータベースパスに作成した空のDB String outFileName = path + DB_NAME; OutputStream mOutput = new FileOutputStream(outFileName); // コピー byte[] buffer = new byte[1024]; int size; while ((size = mInput.read(buffer)) > 0) { mOutput.write(buffer, 0, size); } // Close the streams mOutput.flush(); mOutput.close(); mInput.close(); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } /* * データベースのコピー 圧縮されている場合 */ private void databaseUnZipCopy(String path, String name) { // TODO 自動生成されたメソッド・スタブ try { AssetManager am = getResources().getAssets(); InputStream is = am.open("ropou.zip",AssetManager.ACCESS_STREAMING); ZipInputStream zis = new ZipInputStream(is); ZipEntry ze = zis.getNextEntry(); if (ze != null) { String fullPath = path + DB_NAME; FileOutputStream fos = new FileOutputStream(fullPath, false); byte[] buf = new byte[1024]; int size = 0; while ((size = zis.read(buf, 0, buf.length)) > -1) { fos.write(buf, 0, size); } fos.close(); zis.closeEntry(); } zis.close(); } catch (Exception e) { e.printStackTrace(); } } /* * データベースヘルパー */ public class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO 自動生成されたコンストラクター・スタブ } @Override public void onCreate(SQLiteDatabase db) { // TODO 自動生成されたメソッド・スタブ } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO 自動生成されたメソッド・スタブ } //空のデータベース作成 public void createEmptyDataBase(){ Log.i("kenpoActivity", "空のデータベース作成" ); this.getReadableDatabase(); } } }
空のデータベース作成する部分は、databases フォルダがある場合は必要ないが、
アプリをインストールした時には、databases フォルダが無いので必要になる、
作成されるデータベースのパーミッションもちゃんと設定できるので、
空のデータベースを作成する部分は必要