2012年9月27日木曜日

assetsフォルダのデータベース利用2

圧縮されているデータベースを解凍してコピーする。

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 フォルダが無いので必要になる、
作成されるデータベースのパーミッションもちゃんと設定できるので、
空のデータベースを作成する部分は必要

関連記事

0 件のコメント:

コメントを投稿