본문 바로가기
개발/Android

[Android] assetmanager 와 sqliteopenhelper 에 대한 이야기.

by 언제나초심. 2016. 4. 10.
반응형

여러가지로 조사해보고 테스트해본 결과 느껴지는 것으로는.


SQLiteOpenHelper 는 생성할 때에 외부 장치에 생성하는 듯 하다. 대체적으로 디바이스 에서는 /data/data/[패키지명]/databases/[디비명] 

이런 경로에 저장이 되지 않을까 싶다. 


동일한 파일이 없을 시에는, onCreate 을 호출 할 것이고, 있는 경우에는 버전값 등을 기준으로 삼아서, onUpgrade 를 호출 할 것이다. 


즉, 개발자가 디비를 미리 생성해서 넣는 방식이 아니고, 


쿼리를 이용하거나, 외부 디비 또는 외부 서버와의 연동으로 onCreate, onUpgrade 등을 통해서 데이터를 집어넣는 방식이라는 얘기다. 





아마도, 서버DB < - > 디바이스DB


이런 구성을 위한 방식인 것으로 보인다. 즉, 대부분의 정보는 서버와 통신을 하고, 간단한 설정 등을 디바이스DB 에 저장해서 쓰려는 용도인 듯 하다. 그래서 경량의 sqlite 를 쓰는지 모르겠다. 



문제는, 서버가 없는 단순한 어플의 경우이다. 우리는 정보를 바로 어플 안에 넣고 싶을 수가 있다. 


이 경우에 미리 sqlite db 파일을 생성해놓고, 이것을 어플 안으로 집어넣는다. 


Android Studio 에서는 이것이 일종의 리소스 이기 때문에, assets/db/[디비명] 으로 들어가게 된다.


이제 이것을 디바이스(또는 adb) 에서 실행시키면 어떻게 되는가?




우리의 SQLiteOpenHelper 는 내가 넣어놓은 sqlite 를 신경쓰지 않을 가능성이 높다. 스스로 어딘가에 새로운 sqlite db 파일을 생성하려고 할 것이다. (아마도 /data/data/[패키지명]/databases/[디비명]  같은 경로에 말이다) 



그래서, 이 경우에 대처하기 위해서 많은 검색에서 나오는 대안은. copy 하는 방식이다. 




먼저 assets 에 들어갔던 파일은, AssetManager 에서 접근을 할 수가 있다. AssetManager 를 쓰는 방식은 


AssetManager assets = context.getAssets();


과 같다. 




assets.open() 형태로 open 메서드를 호출하면, Stream 형식으로 리턴하게 된다. 이것을 가져다 쓰면 된다. 




그렇다면, 결론적으로는. 


AssetManager 를 통해서 assets/db 에 넣어놨던 파일을 불러들이고 InputStream 과 같은 형태로 해서, /data/data/[패키지명]/databases/[디비명] 에 덮어쓴다. 






머리도 식혀볼 겸, 한번 정리해보았다.

반응형