티스토리 뷰



이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 관리자의 Tipssoft 이야기를 들어보세요 ( 트위터 ID : tipssoft )
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
* 이 예제는 안드로이드 팜으로 만들어졌습니다.
안드로이드 시스템에서 주소록 어플리케이션을 만드는 방법은 크게 두가지로 나눌 수 있습니다.
첫번째는 직접 파일 시스템을 이용하여 데이터베이스를 구성하는 것이고, 두번째는 안드로이드
시스템이 라이브러리 형태로 가지고 있는 SQLite 를 사용하는 것입니다.
첫번째 방법은 프로그래머가 어플리케이션의 특성과 본인의 스타일에 따라서 알아서 해야하므로
설명하지 않고, 이번 강좌에서는 범용적으로 데이터를 관리할 수 있는 SQLite 를 사용하는 방법에
대하여 알아보도록 하겠습니다.
1. 데이터베이스 열기
SQLite 에 접근하여 데이터베이스를 사용하기 위해서는 먼저 데이터베이스에 연결을 해야합니다.
SQLite 의 데이터베이스에 접근을 쉽고 간편하게 하기위해서 SQLiteOpenHelper 라는 추상 클래스가
제공되며 프로그래머는 이 클래스를 상속받은 사용자 정의 클래스를 생성하여 사용할 수 있습니다.
SQLiteOpenHelper 클래스에는 onCreate, onUpgrade 메소드가 추상메소드로 정의되어 있으므로
사용자 정의 클래스에서 생성자와 함께 onCreate, onUpgrade 메소드를 반드시 재정의하여 사용해야
합니다. 데이터베이스가 열릴 때 호출되는 onOpen 메소드의 경우에는 구성해야하는 코드가 복잡하기
때문에 필요한 경우만 재정의하여 사용하는 것이 좋습니다.
재정의할 생성자와 onCreate, onUpgrade 메소드는 다음과 같은 역할을 해야합니다.
- 생성자
데이터베이스의 생성 및 버전 관리를 합니다. 생성자에서 슈퍼클래스를 호출할 때 명시하는
버전에 따라서 데이터베이스가 연결될 때 onUpgrade 가 호출될 수 있습니다.
- onCreate
데이터베이스가 처음 생성됐을 때 호출되는 메소드로 사용할 테이블을 생성하고 초기화하는
작업을 수행합니다.
- onUpgrade
데이터베이스에 업그레이드가 필요할 때 호출됩니다. 테이블을 삭제하고 추가하거나 새 버전의
스키마를 추가하는 등의 작업을 수행합니다. 이 메소드가 호출되면 데이터베이스 버전은 자동으로
증가됩니다.
아래의 코드는 SQLiteOpenHelper 클래스를 상속받아 구현한 간단한 사용자 정의 클래스입니다.
// SQLiteOpenHelper 클래스를 상속받은 FriendDBHelper 클래스
public class FriendDBHelper extends SQLiteOpenHelper {
// 생성자
public FriendDBHelper(Context context) {
// 슈퍼클래스에 생성할 데이터베이스 이름과 버전을 명시하여 전달한다.
super(context, "FriendBook.db", null, 1);
}
// 데이터베이스가 처음 생성되면 호출되는 메소드
public void onCreate(SQLiteDatabase db) {
// 테이블을 생성하는 SQL 쿼리를 구성한 후 실행하여 테이블을 생성한다.
db.execSQL("create table friend(_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT, phone1 TEXT, phone2 TEXT, email TEXT);");
}

// 데이터베이스가 업그레이드될 때 호출되는 메소드
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 이전 버전보다 새버전이 큰 경우
if(oldVersion < newVersion) {
// 테이블을 제거하는 SQL 쿼리를 구성한 후 실행하여 테이블을 제거한다.
db.execSQL("DROP TABLE IF EXISTS friend");
// 테이블을 다시 생성한다.
onCreate(db);
// 원래 버전별로 테이블의 구성을 달리하거나 alter table 쿼리문을 사용하여
// 테이블의 구조를 변경해야하지만 간단하게 테이블을 제거하고 다시 생성하도록
// 구성하였다.
}
}
}
위와 같은 클래스를 정의한 후 데이터베이스를 이용하려는 컴포넌트에서 이 객체를 생성하면
사용시 자동으로 데이터베이스가 열리게 됩니다.
2. 데이터 검색 및 수정하기
SQLiteOpenHelper 클래스는 데이터베이스를 여는 것뿐만 아니라 읽고 쓰는것도 간단하게 제공하고
있습니다. SQLiteOpenHelper 객체로 getReadableDatabase 와 getWritableDatabase 메소드를
호출하면 각각 데이터베이스를 읽고, 쓸 수 있는 SQLiteDatabase 객체가 반환되어 이 객체로
직접 SQL 쿼리문을 구성하여 전송하거나 쿼리의 각 항목을 매개변수로 전달받는 메소드를 호출하여
데이터를 검색하거나 추가/수정/삭제 할 수 있습니다.
이 강좌에서는 간단한 SQL 쿼리에 대해서 안다는 가정하에 쿼리를 직접 구성하는 것에 초점을 맞추어
설명하도록 하겠습니다.
2.1 데이터 검색
데이터 검색을 하기위해서는 SQLiteOpenHelper 클래스의 getReadableDatabase 메소드를
이용해야합니다. 이 메소드는 데이터베이스를 읽기용으로 열어주는 기능을 하는데 이 때
데이터베이스가 없으면 직접 생성한 후에 열도록 되어 있습니다.
데이터 검색의 경우 여러개의 행 데이터를 반복해서 가져와야하기 때문에 Cursor 객체를 이용하여
각 행에 위치한 데이터를 가져올 수 있도록 구현해야 합니다. 다음은 간단하게 데이터를 검색하는
코드를 구현한 것입니다.
// 데이터베이스를 열어주고 데이터베이스를 읽고 쓸 수 있도록 해주는 SQLiteOpenHelper 의
// 사용자정의 클래스를 객체화한다.
FriendDBHelper m_db_helper = new FriendDBHelper(this);
// 데이터를 검색해야하는 경우 데이터베이스를 열고 데이터를 읽을 수 있도록 해주는
// SQLiteDatabase 객체를 얻는다.
SQLiteDatabase db = m_db_helper.getReadableDatabase();
// 데이터를 검색해주는 쿼리를 구성하여 rawQuery 메소드를 호출한다.
Cursor cursor = db.rawQuery("select name, phone1, phone2, email from friend", null);
// 각 컬럼의 검색 결과를 저장할 String 변수
String name, phone1, phone2, email;
// 다음 행으로 커서를 이동시킨다.
while(cursor.moveToNext()) {
// 첫번째 컬럼의 데이터를 문자열 형식으로 얻는다.
name = cursor.getString(0);
// 두번째 컬럼의 데이터를 문자열 형식으로 얻는다.
phone1 = cursor.getString(1);
// 세번째 컬럼의 데이터를 문자열 형식으로 얻는다.
phone2 = cursor.getString(2);
// 네번째 컬럼의 데이터를 문자열 형식으로 얻는다.
email = cursor.getString(3);

// 데이터 결과를 다른 컨트롤에 설정하거나 별도의 처리를 수행한다.

}
// 커서를 닫는다.
cursor.close();
// 열었던 데이터베이스를 닫는다.
db.close();
2.2 데이터 추가/수정/삭제
데이터를 추가/수정/삭제하려면 SQLiteOpenHelper 클래스의 getWritableDatabase 메소드를
이용해야합니다. 이 메소드는 데이터베이스를 읽고/쓰기용으로 열어주는 기능을 하는데 이 때
데이터베이스가 없으면 직접 생성한 후에 열도록 되어 있습니다.
처음 getWritableDatabase 메소드를 호출하면 데이터베이스가 열리면서 onCreate, onUpgrade,
그리고 onOpen 메소드가 호출되기때문에 메인 스레드에서 getWritableDatabase 메소드를
호출하면 업그레이드시 너무 많은 시간을 필요로 하여 어플리케이션이 응답없음에 빠질 수
있습니다. 그래서 이 메소드를 사용할 때에는 컨텐트 프로바이더(ContentProvider) 를 사용하길
권하고 있으며 이부분에 대해서는 향후에 강좌로 구성하도록 하겠습니다.
또한 getWritableDatabase 메소드를 호출하다가 안드로이드 기기의 용량이 가득 차는 등의 문제가
발생하는 경우 데이터베이스가 읽기 전용으로 열려서 getReadableDatabase 메소드로 반환된
SQLiteDatabase 와 동일한 객체가 반환될 수도 있습니다.
다음은 간단하게 데이터를 검색하는 코드를 구현한 것입니다.
// 데이터베이스를 열어주고 데이터베이스를 읽고 쓸 수 있도록 해주는 SQLiteOpenHelper 의
// 사용자정의 클래스를 객체화한다.
FriendDBHelper m_db_helper = new FriendDBHelper(this);
// 데이터를 검색해야하는 경우 데이터베이스를 열고 데이터를 읽고 쓸 수 있도록 해주는
// SQLiteDatabase 객체를 얻는다.
SQLiteDatabase db = m_db_helper.getWritableDatabase();
// 데이터를 추가하는 쿼리를 구성한다.
String str = "insert into friend(name, phone1, phone2, email) values('홍길동', '010-1111-2222',
'02-1234-5678', 'manager@tipsware.com');";
// 쿼리를 실행한다.
db.execSQL(str);
// 데이터베이스를 닫는다.
db.close();
3. 간단한 예제
이 강좌에서 소개한 방법을 이용하여 친구의 정보를 입력받아서 데이터베이스에 저장하고,
리스트뷰에 친구 목록을 출력해주는 예제를 구성하였습니다. 예제를 실행한 화면은 다음과
같습니다.


댓글