미리 만들어 놓은 sqlite 데이타베이스를
불러와서 사용하는 방법에 대해 알아보자.
특히 사전 등과 같이 많은 데이타가 앱인 경우
앱에 포함시켜 배포하고 최초 실행시 복사하여
사용한다.
---------------------[작업 순서]------------------------
1. assets/db 폴더를 생성한다.
- 안드로이드 app/src/main/ 아래 직접 생성한다.
- db폴더안에 database파일을 복사하여 둔다.
2. App 최초실행시 내부로 복사한다.
- onCreate 함수에서 기존의 테이블 생성하는 코드를 모두 삭제하고
사용자 데이타베이스 유무를 체크하여
없을 경우 복사하여 사용한다.
// Checking whether file is or not
public boolean isCheckDatabase(){
String filePath = PACKAGE_DIRECTORY + "/databases/" + DATABASE_NAME;
File file = new File(filePath);
if (file.exists()) {
return true;
}
return false;
}
// Copying inside app storage from "/db/xxxx.s3db" in assetspublic void copyDataBase(){
Log.d("Working", "copyDatabase"); AssetManager manager = mContext.getAssets(); String folderPath = PACKAGE_DIRECTORY + "/databases"; String filePath = PACKAGE_DIRECTORY + "/databases/" + DATABASE_NAME; File folder = new File(folderPath); File file = new File(filePath);
FileOutputStream fileOut = null; BufferedOutputStream bufferOut = null; try {
InputStream inputStr = manager.open("db/" + DATABASE_NAME); BufferedInputStream bufferStr = new BufferedInputStream(inputStr);
if (folder.exists()) {
}else{
folder.mkdirs(); }
if (file.exists()) {
file.delete(); file.createNewFile(); }
fileOut = new FileOutputStream(file); bufferOut = new BufferedOutputStream(fileOut); int read = -1; byte[] buffer = new byte[1024]; while ((read = bufferStr.read(buffer, 0, 1024)) != -1) {
bufferOut.write(buffer, 0, read); }
bufferOut.flush();
bufferOut.close(); fileOut.close(); bufferStr.close(); inputStr.close(); } catch (IOException e) {
Log.e("Error : ", e.getMessage()); }
}
public void onCreate(SQLiteDatabase db) {
boolean bResult = isCheckDatabase(); // DB가 있는지? Log.d("Workign", "DataBase Check="+bResult); if(!bResult){ // DB가 없으면 복사 copyDataBase(); }
}