package 패키지명1.오픈헬퍼가위치할패키지명; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBOpenHelper extends SQLiteOpenHelper { //The Android’s default system path of your application database.private static String DB_PATH = "/data/data/패키지명/databases/"; private static String DB_NAME = "DB파일명"; public static final int DB_VERSION = 1; private SQLiteDatabase myDataBase; private final Context myContext; /*** Constructor* Takes and keeps a reference of the passed context in order to access to the application assets and resources.* @param context*/public DBOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); this.myContext = context; } @Overridepublic synchronized void close() { } @Overridepublic void onCreate(SQLiteDatabase db) { } @Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }-------------------------------------------------------------------------------------------------------------------------------
이렇게 SQliteOpenHelper 를 상속받은 DBopenHelper 클래스를 Domain 쪽 클래스랑 다른 패키지에 놓고
-------------------------------------------------------------------------------------------------------------------------------
package 패키지1.도메인이있는패키지명; import android.content.Context; import android.content.res.AssetManager; import android.util.Log; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** * Created by KB on 2016-10-20. */ public class SQLiteUpDownService { private static SQLiteUpDownService instance; private static final String extDb3FilePath = "databases/데이터베이스파일명"; private static final String innerDbPath = "data/data/패키지1/databases/데이터베이스파일명"; private SQLiteUpDownService(){ //기본 Constructor입니다. } public static SQLiteUpDownService getInstance(){ if(instance==null){ instance = new SQLiteUpDownService(); } return instance; }//싱글턴 방식을 사용합니다. //업로드 기능입니다. //PDA to PC public void upload(){ } //다운로드 기능입니다. //PC to PDA public void download(Context context){ //외부에 파일이 존재하는지 체크한 뒤에 파일 복사를 하는 메소드입니다. if(checkFile(context)){ //extDb3File(외부 파일) 을 내부 경로에 복사합니다. (PC to local DB) File extDb3File = new File(extDb3FilePath); File innerDb3File = new File(innerDbPath); if(innerDb3File.exists()==false){ copyDataBase(context); } } } private boolean checkFile(Context context){ //파일이 존재할 경우 true를 리턴해주는 파일 존재 확인용 메소드입니다. try { InputStream myInput = context.getAssets().open(extDb3FilePath); } catch (IOException e) { return false; } return true; } public void copyDataBase(Context context){ String PACKAGE_NAME = context.getPackageName(); AssetManager manager = context.getAssets(); String folderPath = "/data/data/" + PACKAGE_NAME + "/databases"; String filePath = "/data/data/" + PACKAGE_NAME + "/databases/데이터베이스파일명"; File folder = new File(folderPath); File file = new File(filePath); FileOutputStream fos = null; BufferedOutputStream bos = null; try { InputStream is = manager.open("databases/데이터베이스파일명"); 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()); } } }
-------------------------------------------------------------------------------------------------------------------------------
이렇게 사용하면 된다.
그리고 느낀 점은 Assets 경로 굉장히 이상한 듯.
실상 /data/data/패키지명/assets/databases/데이터베이스파일명 으로 접근해야 할 거 같은데 아님.
-------------------------------------------------------------------------------------------------------------------------------
그리고 assets 밑에 db나 data나 database나 아무 폴더명으로 지어도 되지만 보통 databases를 사용하기에
databases를 쓰기로 했다.
댓글
댓글 쓰기