[안드로이드] 안드로이드스튜디오(Android Studio), 경량 임베디드 데이터베이스(SQLite:에스튜엘 라이트) 활용하기, SQLite Browser DownLoad, SQlite Device DB 파일 가져오기, 안드로이드 예제, 안드로이드 강좌
파푸맘 블로그(http://blog.naver.com/bobe6294)
안녕하세요 정보처리마법사 입니다.
이번 포스팅의 주제는 안드로이드 데이터베이스(SQLite)에 관한 내용입니다.
데이터베이스를 사용하는 절차는 크게 세 단계로 나눌 수 있는데 가장 먼저 DB와 테이블을 생성하고 이를 업그레이드하는 기능을 담당하는 DBHelper 클래스와 이 클래스를 사용해서 실제로 테이블에 질의를 날리는 DBHandler 클래스를 만들어야 합니다. 그리고 비즈니스 로직에 의해 DBHandler 클래스를 호출하는 사용자 클래스를 만들면 됩니다.
이어서 문자열 추가하고 조회하는 예제를 살펴보겠습니다. 사용자가 에디트텍스트에 자동차 이름을 입력하고 "추가"버튼을 클릭하면 자동차 이름을 데이터 베이스에 저장합니다. 그리고 아래 에디트텍스트에 숫자 값을 입력하고 "조회"버튼을 클릭하면 해당 숫자 값과 연관된 자동차 이름을 조회합니다. 이 숫자값을 자동차이름이 추가된 순서 값이라고 보면 됩니다.
일단 에디트텍스트 두개와 버튼두개를 레이아웃에 배치합니다. 아이디는 그냥 default로 놔뒀습니다.
패키지 안에 DBHandler.java , DBHelper.java 파일을 생성해서 작성하면 됩니다.
DBHelper.java 소스코드 입니다. DBHelper 클래스는 SQLiteOpenHelper 클래스를 확장한 클래스입니다. SQLiteOpenHelper 클래스에는 데이터베이스와 관련된 처리를 할 수 있는 메소드들이 준비가 되어있기 때문에 우리는 생성자와 onCreate() 메소드, 그리고 onUpgrade() 메소드만 작성하면 됩니다.
생성자에서는 생성할 DB이름을 지정하면 됩니다. super는 상위 클래스의 생성자를 호출하는 자바 키워드이며, 여기서는 SQLiteOpenHelper 클래스의 생성자를 호출합니다.
super(context, "dbpapoo.db", null, 1);
"dbpapoo.db" 는 데이터베이스 이름이며 1은 DB 버전입니다. 생성자의 세 번째 인자는 CursorFactory를 지정하는 부분으로, Cursor를 새로 만드는 것이 아니라면 null을 지정합니다. DB 버전은 애플리케이션의 데이터베이스가 변경될 때 증가시키면 됩니다. 데이터베이스가 변경되면 기본에 설치된 애플리케이션의 데이터베이스를 변경해야 합니다. 그렇지 않을 경우에는 기존 사용자가 새로운 버전의 애플리케이션을 설치하고 실행하는 순간 에러가 발생할 것입니다. 설치되면서 자동으로 데이터베이스를 변경하게 만들경우 기존 사용자가 사용하던 데이터베이스의 데이터들이 사라지게 됩니다. 그렇기 때문에 개발자는 기존 데이터베이스를 변경하는 코드를 작성해서 기존 사용자의 데이터를 유지할수 있도록 해야합니다. 이렇게 처리할 수 있도록 해주는 것이 바로 onUpgrade() 메소드입니다. 이 메소드는 이미 설치된 데이터베이스의 버전과 새로 설치하는 애플리케이션의 데이터베이스 버전을 비교해서 차이가 날 때 실행됩니다. 그러므로 이 메소드에서 버전 변경에 따른 적당한 처리를 해주면 됩니다. 이 예제에서는 단순히 기존 테이블을 삭제하고 새로 만들게 되어있지만
실제 애플리케이션에는 삭제가 아닌 다른 처리를 해야 할 것입니다.
DBHandler.java 소스코드 모습입니다. DBHandler 클래스에는 테이블과 관련된 메소드를 작성하면 됩니다. 테이블에 데이터를 추가하고, 삭제, 수정하는 등의 메소드를 작성하면 됩니다.
this.db = helper.getWritableDatabase();
getWritableDatabase() 메소드는 쓰기 가능한 데이터베이스를 반환하는 메소드입니다. 이 메소드가 반환한 데이터베이스객체(SQLiteDatabase)를 사용해서 질의를 수행할 수 있습니다.
ContentValues values = new ContentValues();
ContentValues 객체는 단순히 키와 값을 저장하는 Map 계열의 클래스입니다.
query() 메소드와 rawQuery() 메소드를 통해 데이터베이스에 질의를 할 수 있는데, query() 메소드는 메소드형식으로 질의를 수행하는 방식이며, rawQuery() 메소드는 완전한 SQL 문장으로 질의를 수행하는 메소드입니다.
cursor.moveToFirst();
이 메소드는 커서의 첫 번째 위치, 즉 여러 데이터 중에서 가장 첫 번째 데이터에 접근할 수 있는 위치로 이동하는 메소드입니다. 커서를 반환받은 후에는 항상 moveToFirst() 메소드를 호출해야 됩니다. 그 이유는 커서는 데이터베이스에서 조회한 테이블의 결과 집합의 첫 번째 바로 이전 위치를 가리키고 있기 때문입니다.
SQLite를 사용하다 보면 실행한 여러 개의 질의 중에서 하나라도 실패하면 모든 질의를 취소해야하는 경우가 생깁니다. 예를 들면 계좌 송금 처리 같은 경우입니다. 이런 것을 바로 트랜잭션 처리라고 하며, 안드로이드의 SQLite 에서는 이를 지원하기 위해 beginTransaction(), setTransactionSuccessful(), endTransaction() 메소드를 제공하고 있습니다. 시작과 끝을 비긴과 엔드로 감싸고 데이터 베이스 조작을 한 다음, 정상적으로 처리되었을 경우에는 setTransactionSuccessful()을 호출하고, 그렇지 않은 경우에는 어떤 처리도 하지 않는 방식입니다.
db.beginTransaction();
try{
//DB조작
db.setTransactionSuccessful();
}catch(Exception e){
//트랙잭션 실패
}finally{
db.endTransaction();
}
아래는 MainActivity.java 모습입니다.
long cnt = dbhandler.insert(carName);
insert()메소드는 테이블에 데이터를 정상적으로 추가하면 추가된 열의 아이디를 반환하며, 그렇지 않을 경우에는 -1을 반환합니다. 그래서 이 값을 기준으로 테이블 추가 성공 여부를 판단해서 토스트로 화면에 보여주면 됩니다.
dbpapoo.db 의 내용을 보고 싶어서 파일의 경로를 알고 싶다면 일단 디바이스의 파일을 밖으로 복사를 해야 하는데요(물론 바로 보는 다른 방법도 있습니다.) , Android Device Monitor 를 실행을 하면,
디바이스에서 db 파일을 가져오려면 다른 처리를 조금 더 해야해서 그냥 에뮬로 실행해서 db파일을 가져오는 방법을 살펴보겠습니다.
그래도 혹시 모르니 디바이스에서 가져오는 방법도 언급하겠습니다. 디바이스에서 파일을 복사해오려면 AndroidMinifest.xml 파일에 퍼미션을 추가해줘야 합니다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permisson android:name="android.permission.READ_EXTERNAL_STORAGE"/>
[디바이스에서 DB파일 경로 확인 및 가져오기 관련 자세한 정보 새창열기 링크 ]
DDMS의 File Explorer 에서 확인할 수 있으며,
경로는 /data/data/패키지명/databases/데이터베이스명 입니다. 파일을 선택한 후 위 이미지와 같이 화면 오른쪽 상단에 아이콘을 보면,
Pull a file from the device 라고 있습니다 아이콘을 클릭한 후 원하는 경로에 복사를 한 후
SQLite Database browser 와 같은 프로그램으로 내용을 보면 됩니다.
[ SQLite Database browser 다운로드 링크 새창 열기 ]
애뮬레이터에서 실행한 초기 화면입니다.
AUDI 를 에디트텍스트에 입력한 후 추가 버튼을 누르니 토스트메시지가 뜹니다.
정상적으로 테이블에 추가가 되었습니다.
SQLite db browser로 실행을 해서 보니 5번째에 AUDI 가 잘 추가된 걸 확인할 수 있습니다.
1번을 조회해보니 토스트메시지로 "자동차 이름 포르쉐" 라고 잘 작동합니다.
2를 조회해도 "자동차 이름 람보르기니" 라고 잘 작동합니다.
이상으로 포스팅을 마칩니다. 감사합니다.
참고서적 : 200개의 단계별 예제로 배우는 안드로이드 4.0 [제이펍]
Fin.
잘 못 된 정보가 있으면 말씀해주세요~
공감버튼 클릭은 작성자에게 큰 힘이 됩니다. 행복한 하루 되세요.