본문 바로가기
개발/안드로이드

안드로이드 외부 DB Assets에 넣어서 사용

by darksilber 2011. 12. 9.
반응형

출처-  http://sungho0459.blog.me/40130901885

이번에 정리할 내용은 데이터 베이스 입니다.

(구글 맵에 대해서 하려고했지만 현재 진행중이지 않은 다른 프로젝트이므로 패스~)

안드로이드에서 데이터베이스를 쓰기에 너무나 많은 검색이 필요했습니다.

이미 만들어진 db파일을 읽어오기란 방법이 많이 없더군요.

그것도 그것인데 용량이 큰 db파일은 읽어올려면 파일을 분할해서 합치는 방법이라던지

아니면 확장자 이름을 다르게 올려서 불러오기 할때 확장자를 바꾼다던지

그런 불편한 점이있었는데

저도 물론 웹상에서 따온 소스코드이지만 모두에게 편하게 알리고자

프로젝트를 압축파일로 변환하여 첨부파일에 추가해 놓았습니다.

이 프로젝트에서 하는 것은 다음과 같습니다.

1.기존 작성된 db파일을 패키지 경로에 복사한다는점 (apk형태로 같이 배포한다는 점)

2.패키지에 복사된 db파일을 읽어서 출력하는 점 입니다.

먼저 가벼운 소스코드부터 보겠습니다.

  1. /*
  2. * Database for Android
  3. *
  4. * example
  5. * 1.copy to '/data/data/..'
  6. * 2.read to database
  7. *
  8. * do not remove
  9. */
  10. package com.test.db;
  11. import java.io.File;
  12. import java.io.FileNotFoundException;
  13. import java.io.FileOutputStream;
  14. import java.io.IOException;
  15. import java.io.InputStream;
  16. import android.app.Activity;
  17. import android.content.Context;
  18. import android.content.res.AssetManager;
  19. import android.database.Cursor;
  20. import android.database.sqlite.SQLiteDatabase;
  21. import android.os.Bundle;
  22. import android.util.Log;
  23. import android.widget.TextView;
  24. public class ActivitytestDB extends Activity {
  25. /** Called when the activity is first created. */
  26. @Override
  27. public void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.main);
  30. initialize(getApplicationContext());
  31. try{
  32. // 'data/data'에 생성된 db파일 읽어오기
  33. SQLiteDatabase db = openOrCreateDatabase("tt2.db", Context.MODE_PRIVATE, null);
  34. // 쿼리로 db의 커서 획득
  35. Cursor cur = db.rawQuery("SELECT * From db", null);
  36. // 처음 레코드로 이동
  37. cur.moveToFirst();
  38. // 읽은값 출력
  39. Log.i("move!!!",""+cur.getString(0));
  40. TextView tv = (TextView)findViewById(R.id.textView);
  41. tv.setText(cur.getString(0));
  42. }catch(Exception e){
  43. Log.i("_)",""+e.toString());
  44. }
  45. }
  46. public static final String PACKAGE_DIR = "/data/data/com.test.db/";
  47. public static final String DATABASE_NAME = "tt.db";
  48. public static final String COPY2DATABASE_NAME = "tt2.db";
  49. public static void initialize(Context ctx) {
  50. // check
  51. File folder = new File(PACKAGE_DIR + "databases");
  52. folder.mkdirs();
  53. File outfile = new File(PACKAGE_DIR + "databases/" + COPY2DATABASE_NAME);
  54. if (outfile.length() <= 0) {
  55. AssetManager assetManager = ctx.getResources().getAssets();
  56. try {
  57. InputStream is = assetManager.open(DATABASE_NAME, AssetManager.ACCESS_BUFFER);
  58. long filesize = is.available();
  59. byte [] tempdata = new byte[(int)filesize];
  60. is.read(tempdata);
  61. is.close();
  62. outfile.createNewFile();
  63. fo.write(tempdata);
  64. fo.close();
  65. } catch (IOException e) {
  66. e.printStackTrace();
  67. }
  68. }
  69. }
  70. }

sqlitebrower프로그램도 첨부파일에 추가해두었습니다.

알집은 잘 이용하지 않지만 그래도 공유용으로 적합하기에 egg 확장자로 파일 2개로 압축해서 올립니다.

tt.db라는 파일을 sqlitebrowser란 프로그램으로 제작하여

프로젝트의 assets 폴더에 넣고 실행한 결과 입니다.

소스코드와 파일 삽입은 아래 그림과 같습니다.

진행중인 프로젝트는 비밀로 하고 ~ ㅎㅎ

설명은 이만 줄입니다.

굳이 설명이 필요한 소스코드라고 생각되지 않네요..

쿼리문들은 http://w3schools.com/php/php_mysql_select.asp 이곳을 참고하면 좋습니다.

영어로 되어있지만 어느정도는 광고이고 실질적인건 소스코드로 잘 제공되어서 알아보기 쉽습니다.

여기서 DB가 아닌 file을 하고 싶을땐 /res/raw/에 파일을 넣고

"databases"를 "files"로 교체하면 됩니다. ("databases/" -> "files/", "databases" -> "files")

반응형

댓글