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 MapSelectSizeInfoMap(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"; Mapmap = 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; // ...
'안드로이드 개발 팁' 카테고리의 다른 글
android handle을 이용한 지연처리 (0) | 2012.05.21 |
---|---|
android 백그라운드 처리 작업 ( handler, AsyncTask ) (0) | 2012.05.09 |
안드로이드 디자인 (0) | 2012.05.03 |
android 가로 스크롤 슬라이딩 메뉴(Sliding Menu) (3) | 2012.04.17 |
안드로이드에서 강제로 터치 이벤트 발생시키기 (0) | 2012.04.16 |