본문 바로가기

구글과인터넷/안드로이드

안드로이드 데이터베이스 관련

안드로이드에서 Database를 sqlite를 사용한다.

Sqlite3 는 안드로이드 SDK 에 포함되어 있기 때문에 따로 구해서 설치 하지 않아도 된다.

 

Database를 생성하고 Command 창에서 접근하는 방법을 알아보자.

 

1. 에뮬레이터를 구동시킨다.





 

 

2. android sdk가 설치 된 폴더에서 tools 폴더안에  adb.exe 있는지 확인한다.

   확인을 했으면 시작 > 실행 > cmd 를 실행하여 커맨드 창을 하나 띄운다.

   위에서 확인한 adb.exe가 있던 폴더로 이동한다.





  

 

3. 이제 명령어를 쳐서 shell을 실행 시키자.

    adb shell 

    정상적으로 작동한다면 아래와 같이 실행이 될 것이다.

   




 

4. 경로를 한번 확인하여 보자.

    --------------------------------------

    # pwd

    pwd

    /

    #

    --------------------------------------

    지금까지 한것을 따라했다면..

    Eclipse에서 경로는 DDMS > File Explorer의 위치는 아래 그림과 같다





 

5. Database도 data 이니 경로를 옮겨 보자

    /data/data/ 경로의 하위에 에뮬레이터가 구동되면서 현재 실행시킨 프로젝트의

    Activity가 생성되어진 폴더가 있을 것이다.

 

    ex> 실행 시킨 Project가 AndroidTest1이고 Activity가 AndroidTest1.first 패키지에 들어 있다면

    -----------------------------------------------------------------------------------

    # cd /data/data/AndroidTest1.first

    -----------------------------------------------------------------------------------

   위와 같은 폴더가 생성되어져 있을 것이다.

   해당 경로로 이동한다.





 

6. 경로를 위와 같이 변경했다면 Database 관련 폴더를 생성하여 보자





 그리고 해당 폴더로 이동을 한다





 

7. 이렇게 생성한 폴더를 Eclipse에서 확인하여 보면 DDMS > File Explorer에 다음과

   같은 경로가 있을 것이다.





 

8. 이제 Database를 생성하여 보자.

   sqlite3 sample.db 이렇게 하면 sample.db가 생성이 된다.





 

9. Table을 생성하여 보자.





 test 라는 table을

 컬럼으로는 id라는 integer 속성의 primary key , autoincrement(자동증가) 옵션을

                 name이라는 varchar(30) 으로

 만들었다.

 

10. 데이터를 넣어 보자.





 

11. insert한 Data를 Select 해보자.





확인 해본 결과 방금 집어넣은 Data가 잘 들어가 있는 것을 확인 할 수 있다.

 

12. Eclipse의 DDMS > File Explorer에서 확인하면 다음과 같은 db 파일이 생성된 것을

     확인 할 수 있다.





 

이상 안드로이드 환경에서 sqlite 사용법을 알아 보았다. 


///////////////////////////////////////////////////////////////////////////////////////////////////////////


약간 복잡한 기초 데이터를 위해 초기 실행시 Create Table 도 하고 insert도 할 수 있겠지만, 별도의 db 파일을 만들어 관리하고 싶다면 아래와 같은 방법을 쓰는 것도 한가지 방법입니다

1. db 파일을 assets에 넣습니다

2. 아래 함수를 적당한 위치에 넣습니다

public static void initialize(Context ctx) {
  // check 
  File folder = new File(ROOT_DIR + "databases");
  folder.mkdirs();
  File outfile = new File(ROOT_DIR + "databases/" + DATABASE_NAME);
  if (outfile.length() <= 0) {
   AssetManager assetManager = ctx.getResources().getAssets();
   try {
    InputStream is = assetManager.open(DATABASE_NAME, AssetManager.ACCESS_BUFFER);
    long filesize = is.available();
    byte [] tempdata = new byte[(int)filesize];
    is.read(tempdata); 
    is.close();
    
    outfile.createNewFile();
    FileOutputStream fo = new FileOutputStream(outfile);
    fo.write(tempdata);
    fo.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
풀 코드가 아니라 크게 도움은 안되지만 컨셉을 이해하실 수 있을 것이라고 생각됩니다. ROOT_DIR은 아래와 같이 선언되어 있습니다. 경로는 자기 패키지 경로로 수정해주시면 됩니다. 
public static final String ROOT_DIR = "/data/data/com.sohon.test/";
DATABASE_NAME 은 assets에 복사해놓은 파일명입니다 이 경우 lecture.db가 되겠네요. 저는 폴더를 따로 만들었습니다. 이를 위해 먼저 3,4번 라인에서 패키지 경로 밑에 database란 폴더를 생성합니다. mkdirs는 이미 폴더가 있으면 실패하게 됩니다. 5번 라인에서 파일을 읽어드립니다. 6번 라인과 같이 파일의 길이가 0보다 작다는 것은 파일이 없다는 의미라고 생각했습니다. 따라서 파일을 복사하는 그 아래 코드를 실행하게 됩니다. asset의 파일을 읽어오기 위해 7번 라인과 같이 assetManager를 이용해서 파일을 오픈합니다. 나머지 내용들은 자바이므로 생략합니다. 혹시 이해가 안되는 부분이나 더 나은 방법이 있다면 답글 주세요.


출처 : http://bunhere.tistory.com/153
출처:[팁]기존에 생성된 (Sqlite3) DB를 안드로이드에서 이용하기
////////////////////////////////////////////////////////////////////////////////////////////////

실제 단말기에서 App을 돌리면, 에뮬에서 작업한 db가 생성되지 않는다.
이클립스로는 갤럭시s에서는 /sdcard 제외한 내부 파일시스템에는 접근할 수도 없다.






그럼 애써 작업한 db 파일을 못쓴다는것인가?

찾아본 방법중 하나는,
이클립스에서 빌드하기전에, assets 이란 폴더에 해당 db 파일을 카피해서 넣고,
빌드후 어플리케이션내에서 해당 패키지 폴더 명으로 db 파일을 카피를 하는 방법이 있었다.

첫번째 방법은 뻑나기 좋으므로,
두번째 방법은 웹에서 db를 다운로드 받아서 해당 패키지에 db를 카피하는것이 가장 좋을듯하다.
상용되는 대부분의 App들이 웹으로부터 db 파일을 받아서 업데이트가 이루어 질것이다.

수많은 데이터를 parsing 받아 db에 저장하는 식은 아무리 초고속 인터넷이라도
엄청난 시간이 소요될것이니까...

물론 위 두 방법다 자바 입출력 메소드를 통해 이루어진다.


늘 써오던 자바 입출력 메소들를 써서, 파일을 불러들이고, 다시 쓰면 된다.
단, assets 에 있는 파일명과 일치 해야된다.
private void copydb(Activity act) {
 
		AssetManager am = act.getAssets();
		File f = new File("/data/data/com.ludvan/databases/parking.db");
 
		FileOutputStream fos = null;
		BufferedOutputStream bos = null;
 
		try {
 
			InputStream is = am.open("parking.db");
			BufferedInputStream bis = new BufferedInputStream(is);
 
			// 만약에 파일이 있다면 지우고 다시 생성
			if (f.exists()) {
				f.delete();
				f.createNewFile();
			}
			fos = new FileOutputStream(f);
			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();
 
			fos.close();
			bos.close();
			is.close();
			bis.close();
 
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
이것때문에 반나절 삽질한것 같다...

만약에 db 파일이 1MB 이상이면, 조건에 걸려서 카피가 되지 않는다.
이럴땐, 파일을 조각내서 카피하면 되는데 방법은 아래의 URL 참고.

http://www.androidpub.com/191797

http://hyeongkyu.net/110090943249

http://nashorn.tistory.com/category/?page=8


//////////////////////////////////////////////////////////////////////////////////////////////////