반응형

APK 배포시 Database정보 포함하기

 

앱을 설치할 때, 기본적으로 가지고 있어야 하는 초기데이터가 있습니다.

작업한 Database파일을 포함하여 배포하는 방법을 알아 보겠습니다.

 

※ /data/data/{package}/databases/*.db 파일은 기기의 Local영역이기 때문에 작업하던 파일은 함께 배포되지 않습니다.

 

 

Assets영역에 Database파일 복사하기

 

배포시 *.db파일을 함께 배포하기 위해 assets폴더를 만듭니다.

이 폴더의 파일은 배포파일 생성시 같이 포함되게 됩니다.

 

[그림] Assets Folder 생성 메뉴

 

생성된 assets 폴더에 작업한 *.db파일을 복사합니다.

이렇게 파일만 복사하면 APK파일 생성시 함께 포함되어 생성이됩니다.

 

[그림] Database 파일

 

Assets 폴더에 있는 파일을 ~/databases/ 폴더로 복사하기

 

그런데, database정보를 읽으려면, /data/data/{package}/databases/ 영역에 파일이 존재해야 합니다.

이를 위해 프로그램 실행시 assets에 있는 *.db 파일을 위의 경로로 복사해 주면 됩니다.

 

저는 앱이 실행시 가장 먼저 실행되는 MainActivity에 로직을 넣어 처리해 보았습니다.

 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        copyDatabase();  // DB파일 복사
    }

    private void copyDatabase() {

        String DB_PATH = "/data/data/" + getApplicationContext().getPackageName() + "/databases/";
        String DB_NAME = "ReferenceBook.db";

        try{
            // 디렉토리가 없으면, 디렉토리를 먼저 생성한다.
            File fDir = new File( DB_PATH );
            if( !fDir.exists() ) { fDir.mkdir(); }

            String strOutFile = DB_PATH + DB_NAME;
            InputStream inputStream = getApplicationContext().getAssets().open( DB_NAME );
            OutputStream outputStream = new FileOutputStream( strOutFile );

            byte[] mBuffer = new byte[1024];
            int mLength;
            while( ( mLength = inputStream.read( mBuffer) ) > 0 ) {
                outputStream.write( mBuffer, 0, mLength );
            }

            outputStream.flush();
            outputStream.close();
            inputStream.close();

        }catch( Exception e ) {
            e.printStackTrace();
        }

    }

 

소스의 내용은 간단합니다.

앱을 최초 설치시에는 폴더가 존재하지 않을 것이므로, 확인하여 없으면 폴더를 먼저 생성합니다.

그리고, 생성된 폴더에 InputStream과 OutputStream을 이용하여 파일을 복사합니다.

 

간단히 요약하자면...

  1. assets 폴더를 생성하여 *.db파일을 함께 배포하고

  2. 앱 실행시 assets폴더에 있는 *.db파일을 /data/data/{package/databases/ 폴더로 복사한다.

 

The End.

 

반응형