android에서 assets에 있는 기존 sqlite DB를 사용하기 위한 방법이다.


1. sqlite 용 DB를 만든다.  ex) history.db


2. assets 폴더에 복사한다. ex) assets/db/history.db


3. 앱 처음 실행시 앱의 시스템 내부로 DB 파일을 복사한다.


4. DB파일을 호출하여 사용한다.



그럼 세부사항에 대해 살펴보면..

1. sqlite 용 DB를 만든다. ex) history.db

  ===> 내가 직접 만들어 볼 기회가 없어서.. 잘 모르겠지만 SQLite Expert 같은 프로그램으로 생성이 가능한것 같다.


2. assets 폴더에 복사한다. ex) assets/db/history.db

  ===> 잘 복사하면 된다.


3. 앱 처음 실행시 앱의 시스템 내부로 DB 파일을 복사한다.

    아래 두가지 방법이 있으나 여기서는 두번째 방법을 사용한다.

  1) PREFERENCE 같은걸 이용해서 앱의 맨 처음 실행인지 확인하는 방법

      맨 처음 실행시 assets에 있는 DB를 복사

  2) onCreate에서 DB가 있는지 확인하여 있으면 진행, 없으면 assets에 있는 DB를 복사


        // onCreate 에서
        try {
        	boolean bResult = isCheckDB(mContext);	// DB가 있는지?
        	Log.d("MiniApp", "DB Check="+bResult);
        	if(!bResult){	// DB가 없으면 복사
        		copyDB(mContext);
        	}else{

        	}
		} catch (Exception e) {

		}


	// DB가 있나 체크하기
	public boolean isCheckDB(Context mContext){
		  String filePath = "/data/data/" + MiniAppConstants.PACKAGE_NAME + "/databases/" + MiniAppConstants.DB_NAME;
		  File file = new File(filePath);
		  
		   if (file.exists()) {
			   return true;
		   }
		   
		   return false;
		
	}
	// DB를 복사하기
	// assets의 /db/xxxx.db 파일을 설치된 프로그램의 내부 DB공간으로 복사하기
	public void copyDB(Context mContext){
		  Log.d("MiniApp", "copyDB");
		  AssetManager manager = mContext.getAssets();
		  String folderPath = "/data/data/" + MiniAppConstants.PACKAGE_NAME + "/databases";
		  String filePath = "/data/data/" + MiniAppConstants.PACKAGE_NAME + "/databases/" + MiniAppConstants.DB_NAME;
		  File folder = new File(folderPath);
		  File file = new File(filePath);
		  
		  FileOutputStream fos = null;
		  BufferedOutputStream bos = null;
		  try {
		   InputStream is = manager.open("db/" + MiniAppConstants.DB_NAME);
		   BufferedInputStream bis = new BufferedInputStream(is);

		   	   if (folder.exists()) {
		   	   }else{
				   folder.mkdirs();
			   }
		   	   
		   
			   if (file.exists()) {
				   file.delete();
				   file.createNewFile();
			   }
			   
			   fos = new FileOutputStream(file);
			   bos = new BufferedOutputStream(fos);
			   int read = -1;
			   byte[] buffer = new byte[1024];
			   while ((read = bis.read(buffer, 0, 1024)) != -1) {
			    bos.write(buffer, 0, read);
			   }

			   bos.flush();
			 
			   bos.close();
			   fos.close();
			   bis.close();
			   is.close();

		   } catch (IOException e) {
		   Log.e("ErrorMessage : ", e.getMessage());
		  }	
	}
	

4. DB파일을 호출하여 사용한다.

  1) DB관련 class 생성 ex) HistoryDB.java

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import android.content.ContentValues;
import android.content.Context;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.SyncStateContract.Constants;
import android.util.Log;


/**
 * 

* DB 연동 관련 클래스 * 조회 * * * @author d.h.shin * @version 1.0 * @date 2012. 5. 3. * @see */ public class HistoryDB { SQLiteDatabase db; ContentValues row; Context ctx; HistoryDBHelper mHelper; public HistoryDB(Context ctx){ this.ctx = ctx; mHelper = new HistoryDBHelper(ctx); } /** *

* DB 조회 *

* @return 결과를 리턴한다. MAP, */ public Map SelectSizeInfoMap(String sex, String age, String type, String korea){ Map map = new HashMap(); db = mHelper.getReadableDatabase(); Cursor cursor; cursor = db.rawQuery("SELECT usa, eu, uk, japan FROM sizer "+ "Where sex='"+ sex +"' and age='"+ age +"'and type='"+ type +"' and korea='"+ korea +"'" , null); if (cursor.moveToFirst()) { map.put("usa", cursor.getString(cursor.getColumnIndex("usa")) ); map.put("eu", cursor.getString(cursor.getColumnIndex("eu"))); map.put("uk", cursor.getString(cursor.getColumnIndex("uk"))); map.put("japan", cursor.getString(cursor.getColumnIndex("japan"))); }else{ map = null; } cursor.close(); mHelper.close(); return map; } /** *

* DB 조회 *

* */ public String[] SelectKoreaSize(String sex, String age, String type){ int i=0; String[] str; db = mHelper.getReadableDatabase(); Cursor cursor; // SQL 명령으로 읽기 cursor = db.rawQuery("SELECT korea FROM sizer " + "Where sex='"+ sex +"' and age='"+ age +"'and type='"+ type +"' order by ROWID asc" , null); if (cursor.moveToFirst()) { str = new String[cursor.getCount()]; // n행 do { str[i] = cursor.getString(0); i++; }while (cursor.moveToNext()); }else{ str = null; } cursor.close(); mHelper.close(); return str; } /** *

* 프리배팅 점수 목록, nCount 개 오름차순 가져옴 *

* */ public String[][] SelectFreeScore(int nCount){ int i=0; String[][] str; db = mHelper.getReadableDatabase(); Cursor cursor; // SQL 명령으로 읽기, nCount개 조회 cursor = db.rawQuery("SELECT NICKNAME, POINTS, REG_DTIME FROM BB_FREESCORE ORDER BY POINTS ASC limit "+ nCount , null); if (cursor.moveToFirst()) { str = new String[cursor.getCount()][3]; // n행 3열 do { str[i][0] = cursor.getString(0); str[i][1] = cursor.getString(1); str[i][2] = cursor.getString(2); i++; }while (cursor.moveToNext()); }else{ str = null; } cursor.close(); mHelper.close(); return str; } /** *

* DB 파일을 복사하자... // 내장되어 있는 DB를 외장메모리로 복사하는 기능 *

* * @param toPath * @param toFilename * @param srcName * @see */ private void TransferFile(String toPath, String toFilename, String srcName) { String dstName = toPath + "/" + toFilename; try { File targetPath = new File(toPath); Log.d("MiniApp", "Transfer Src = " + srcName); Log.d("MiniApp", "Transfer Dst = " + dstName); targetPath.mkdirs(); File fi = new File(srcName); File fo = new File(dstName); FileInputStream fis = new FileInputStream(fi); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = null; BufferedOutputStream bos = null; if (fo.exists()) { fo.delete(); fo.createNewFile(); } fos = new FileOutputStream(fo); bos = new BufferedOutputStream(fos); int read = -1; byte[] buffer = new byte[1024]; while ((read = bis.read(buffer, 0, 1024)) != -1) { bos.write(buffer, 0, read); } bos.flush(); fos.close(); bos.close(); fis.close(); bis.close(); } catch (FileNotFoundException e) { Log.w("MiniApp", "FILE not found("+ srcName + " or " + dstName +")"); } catch (IOException e) { Log.w("MiniApp", "io exception("+ srcName + "to" + dstName + ")"); } } } /** *

* DB 생성 및 update *

* */ class HistoryDBHelper extends SQLiteOpenHelper { Context mContext; public HistoryDBHelper(Context context) { // Database이름은 실제 단말상에서 생성될 파일이름입니다. data/data/package명/databases/DATABASE_NAME식으로 저장 super(context, history.db, null, 1); // 제일 마지막 인자 : 버젼, 만약 버젼이 높아지면 onUpgrade를 수행한다. mContext = context; } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub // 원래 여기에 create 문이 들어가야하나 기존에 있는 DB를 사용하므로 생략 // db.execSQL("CREATE TABLE TABLENAME(" + // Table Name // "COUNT INTEGER, " + // "HIT_COUNT INTEGER, " + // "FREE_ING TEXT, " + // "REG_DTIME TEXT, " + // "MODIFY_DTIME TEXT " + // ");"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub // 기존에 있는 DB를 사용하므로 생략 // db.execSQL("DROP TABLE IF EXISTS TABLENAME"); // onCreate(db); } }

ArrayList<HashMap<String,String>>를 리턴값으로 주는 예

/**

* <p>

* @Method_Name : SelectTVGuideList

* TV가이드 결과를 리턴  TODO

* </p>

* @return : ArrayList<HashMap<String,String>> 오늘 해당 시간에 방송하는 프로그램 결과를 리턴한다

* @param START_HOUR : 검색할 시간, (만약 오늘의 전체이면 -1) 

* @param type

* @see : 

*/

public ArrayList<HashMap<String,String>> SelectTVGuideList(int START_HOUR, String type){

ArrayList<HashMap<String, String>> myList = new ArrayList<HashMap<String, String>>();

db = mHelper.getReadableDatabase();

Cursor cursor;


if(START_HOUR == -1){

cursor = db.rawQuery("SELECT KEY_NUM, START_HOUR, START_MIN, TITLE, REG_DTIME FROM TV_GUIDE "+

"Where substr(REG_DTIME, 1,10)= strftime('%Y/%m/%d', 'now','localtime') " , null);

}else{

cursor = db.rawQuery("SELECT KEY_NUM, START_HOUR, START_MIN, TITLE FROM TV_GUIDE "+

"Where START_HOUR="+ START_HOUR +" and substr(REG_DTIME, 1,10)= strftime('%Y/%m/%d', 'now','localtime') " , null);

}


HashMap<String, String> map = null;

if (cursor.moveToFirst()) {

do {

map = new HashMap<String, String>(); //초기화

map.put("KEY_NUM", cursor.getString(cursor.getColumnIndex("KEY_NUM")) );

map.put("START_HOUR", cursor.getString(cursor.getColumnIndex("START_HOUR")));

map.put("START_MIN", cursor.getString(cursor.getColumnIndex("START_MIN")));

map.put("TITLE", cursor.getString(cursor.getColumnIndex("TITLE")));

myList.add(map);

}while (cursor.moveToNext());

}else{

myList = null;

}


cursor.close();

mHelper.close();

return myList;

}


  2) DB관련 class 를 이용하여 사용

    // 변수선언
    History HistoryDB pdb;
    Context mContext; 
    String[] sSize;

    // onCreate에서
        mContext = this;
        pdb = new HistoryDB (mContext);  // SizerDB 연동 클래스 인스턴스 

    // 사용예
	private void viewSize(){
		String sex="여자";
		String age="25";
		String type="가방";
		String korea="235";
		
		Map map = new HashMap();
		map = pdb.SelectSizeInfoMap(sex, age, type, korea);
		String usa = map.get("usa");
		String eu = map.get("eu");
		String uk = map.get("uk");
		String japan = map.get("japan");
		
		Log.d("MyTag", usa+", "+eu+","+uk+","+japan);
	}

      // 사용예2

	sSize = pdb.SelectKoreaSize("여자","22","머리핀");
	int i = 0;
	do {
  	Log.d("MyTag", "sSize["+i+"] = "+sSize[i]);
	i++;
	}while (i < sSize.length);
	int nSize = sSize.length;
       // ...



+ Recent posts