Android

SQLite와 SQLiteOpenHelper

yugyeong 2023. 1. 31. 17:51

SQLite란?

안드로이드는 임베디드 데이터베이스로 개발된 경량급 관계형 데이터베이스이다.
SQLite 데이터베이스는 데이터 조회 속도가 빠르고, 표준 SQL을 지원한다.

 

SQLiteDatabase

SQLiteDatabase에는 SQL 명령을 생성, 삭제, 실행하고 다른 일반적인 데이터베이스 관리 태스크를 수행하는 메서드 들이 있다. 즉, SQLiteDatabase 클래스는 하나의 SQLite 데이터베이스를 다루기 위한 핵심 역할을 수행하는 클래스이다. 그러므로 SQLite 데이터베이스 작업을 수행하기 전 반드시 SQLiteDatabase 클래스 객체의 참조를 획득해야 한다.

 

execSQL() 메서드는 데이터 베이스를 만들고 난 다음 SQL문을 실행할 때 사용한다. 이 메서드를 이용하면 테이블을 만들거나 레코드 추가 등 표준 SQL을 사용하는 여러가지 데이터 처리 가능, 결과 값이 없을 때 사용한다. (CREATE, INSERT, DELETE)

 

rawQuery() 메서드는 결과 값을 Cursor 객체로 받을 수 있는 SQL 실행 방법이다. (SELECT)

 

SQLiteOpenHelper

1. 데이터베이스 생성 및 버전 관리를 관리하는 도우미 클래스이다.

 

스키마를 수정할 때는 테이블이 처음 만들어지는 것인지 아니면 사용자가 이미 사용하고 있는지 구별하기 위해 사용한다.

헬퍼 클래스를 사용하려면 SQLiteOpenHelper 클래스를 사용해야 한다.
SQLiteOpenHelper 클래스는 데이터베이스를 만들거나 열기 위해 필요한 작업들을 수행한다.

public class DatabaseHelper extends SQLiteOpenHelper{ // SQLiteOpenHelper 클래스를 상속한 클래스 구현 
} 


2. SQLiteOpenHelper 객체는 new 연산자로 만든다

SQLiteOpenHelper(Context context, String name, SqLiteDatabase.CursorFactory factory, int version) 
  • 첫 번째 파라미터 : Context 객체, 액티비티 안에서 만들 경우에는 this로 지정.
  • 두 번째 파라미터 : 데이터 베이스 이름
  • 세 번째 파라미터 : 널이 아닌 객체를 지정할 경우 쿼리의 결과 값으로 반환되는 데이터를 참조하는 커서를 만들어 낼 수 있는 객체를 전달
  • 네 번째 파라미터 : 정수 타입의 버전 정보
DatabaseHelper dbHelper; // 전역 변수
dbHelper = new DatabaseHelper(this, employee.db, null, 1);  // SQLiteOpenHelper 객체 생성


3. 데이터베이스 파일이 만들어지도록 하려면 getReadableDatabase() 또는 getWritableDatabase() 메서드를 호출해야 한다.

SQLiteDatabase database; // 전역변수
database = dbHelper.getWritableDatabase();


4. 데이터베이스가 만들거나 업그레이드될 때 콜백 메서드가 자동 호출된다.
SQLiteOpenHelper를 상속한 클래스에 정의한다.


onCreate(SQLiteDatabase db) : 데이터베이스가 생성될 때 호출

public void onCreate(SQLiteDatabase db){ 
  println("onCreate 호출됨"); 

  String sql = "create table if not exists emp(" 
              + " _id integer PRIMARY KEY autoincrement, " 
              +  " name text, " 
              + " age integer, " 
              + " mobile text)"; 

  db.execSQL(sql); 
} 


onOpen(SQLiteDatabase db) : 데이터베이스가 열릴 때 호출

public void onOpen(SQLiteDatabase db){ 
	println("onOpen 호출됨"); 
} 


onUpgade(SQLiteDatabase db, int oldVersion, int newVersion) : 
SQLiteDatabase 파일의 버전과 다를 경우에 자동으로 호출, SQLiteDatabase 객체와 함께 기존 버전 정보를 담고 있는 oldVersion과 현재 버전 정보를 담고 있는 newVersion 파라미터가 전달

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
  println("onUpgrade 호출됨: " +  oldVersion + " -> " + newVersion); 
  if(newVersion > 1){ 
  	db.execSQL("DROP TABLE IF EXISTS emp"); 
  } 
} 



5. 데이터 조회하기

Cursor 객체 : SQL문을 이용해 쿼리를 실행한 후 결과 값으로 반환받는 객체
Cursor 객체는 처음에 아무런 레코드를 가리키지 않으며, moveToNext() 메서드를 이용해 그 다음 레코드를 가리키도록 해야한다.

while(cursor.moveToNext()){ 
  int id = cursor.getInt(0); 
  String name = cursor.getString(1); 
  int age = cursor.getInt(2); 
  String mobile = cursor.getString(3); 
  println("레코드#"  + id + ", " + name + ", " + age + ", " + mobile); 
} 


Cursor 객체를 받기 위해 rawQuery() 메서드를 실행한다. 
rawQuery()는 결과 값을 Cursor 객체로 받을 수 있는 SQL 실행 방법이다.

Cursor cursor = database.rawQuery("select _id, name, age, mobile from emp", null); 
int recordCount = cursor.getCount(); // 데이터 갯수 반환 


커서는 사용한 후에 colse() 메서드를 이용해 닫아야한다.

cursor.close();