회사 프로젝트를 하면서 앱스프레소를 접한지 벌써 일주일째...
내부 DB 연동 하느라 엄청 애를 먹었음.
우선 추가된 내용만 적어 놔야겠다.
html 자체에서는 내부 DB 연결이 되지 않기에 플러그인을 생성하기로 결정.
플러그인 생성방법은 앱스프레소 홈페이지에 간단하게 나와있다.
http://appspresso.com/ko/developer-ko/getting-started-ko
우선 플러그인 프로젝트를 생성하게 되면
아래와같이 두개의 폴더가 생긴다.
dbTest 폴더는 처음 생성된 그대로 놔두었습니다.
수정할 일이 생길 수도 있겠지만 일단 저는 패스~
dbTest_android 폴더에서 플러그인에서 수행할 코드를 추가하면 되겠습니다. (.java 파일)
저는 내부 DB sqlite(.db) 파일을 AssetManager로 읽어와서 /data/data/패키지명/databases/ 폴더로 복사를 해서 읽어오려 했습니다. 근데 위의 경로로 파일이 복사가 되지 않는 것입니다. 왜!!!!!
기본 프로젝트를 컴파일해보시면 output 폴더가 생기게 되는데요.
src폴더에 있는 파일들이 output/android/assets/ax-www/에 담기게 됩니다.
근데 이곳에 .db 파일을 읽어오려 하니 경로를 찾을 수 없는 것 같아서
검색하던 중에 안드로이드에서 AssetManager에서 파일 경로를 읽어오기위해서
permission에 READ_OWNER_DATA 추가해주면 된다는 설명이 있길래
dbTest_android 폴더에 있는 AndroidManifest.xml에 permission을 추가해주었습니다.
그러면 output/android/assets/ax-www/ 이경로를 읽어 올 수 있습니다.
흠.. 설명이 좀 두서 없긴 한데 일단 또 잊어버릴까봐 적어 놓습니다. ㅋㅋ
아래는 db 복사 함수 입니다.
public void InitDataBase(AxRuntimeContext context) {
final String ROOT_DIR = "/data/data/com.example.ax/databases/";
final String DATABASE_NAME = DB이름;
File folder = new File(ROOT_DIR);
folder.mkdirs();
File outfile = new File(ROOT_DIR + DATABASE_NAME);
AssetManager assetManager = context.getActivity().getAssets();
InputStream iStream = null;
try {
iStream = assetManager.open("ax_www/"+DATABASE_NAME, AssetManager.ACCESS_BUFFER);
long filesize = iStream.available();
byte[] tempdata = new byte[(int) filesize];
iStream.read(tempdata);
iStream.close();
outfile.createNewFile();
FileOutputStream fos = new FileOutputStream(outfile);
fos.write(tempdata);
fos.close();
Log.i("DB Copy","success");
} catch (IOException e) {
e.printStackTrace();
}
}
