본문 바로가기

FrontEnd/Android 기초

[Android] SQLite3 데이터베이스 01 (feat. SQLiteOpenHelper)

반응형

SQLite3 데이터베이스 활용하는 방법

SQLiteOpenHelper 클래스를 상속받아 처리하는 방법

 

SQLite를 쓰는 장점은 이름에서 알 수 있듯이 매우 가볍다. 사용하는 공간은 설치된 시스템에 따라 다르지만 600kb 미만의 공간을 차지한다. 또한 완전히 독립형이므로 SQLite가 작동하기 위해 시스템에 설치해야 하는 외부 종속성이 없다.

 

SQLite은 이식성이 뛰어난다. 데이터를 분리된 파일의 커다란 배치로 저장하는 다른 일반적은 데이터베이스와는 달리 SQLite는 단일 파일에 전체 데이터가 저장된다. 이 파일은 디렉터리 계층의 어디에나 위치할 수 있으며 이동식 디스크 또는 파일 전송 프로토콜을 통해 공유할 수 있다.


데이터베이스 준비

 
public class Util {

    // 데이터베이스 관련된 상수
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "contact_db";
    public static final String TABLE_NAME = "contact";

    // 테이블의 컬럼 관련된 상수
    public static final String KEY_ID = "id";
    public static final String KEY_NAME = "name";
    public static final String KEY_PHONE = "phone";
}

( util> Util.java)

 

테이블의 정보를 따로 담아두는 Class Util을 선언한다.

이렇게 Util를 설정해두면, 매번 써야하는 정보를 중복선언하는걸 막을수있다.

데이터베이스 이름은: “contact_db”으로 저장.

DATABASE_VERSION은 1로 저장한다.

->이 상수값은 데이터베이스의 스키마가 업데이트(변경)가 될때마다 증가해야한다.

 

 
package com.blockent.contactmanager.model;

public class Contact {
    public int id;
    public String name;
    public String phone;

    public Contact(int id, String name, String phone) {
        this.id = id;
        this.name = name;
        this.phone = phone;
    }

    public Contact(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }
}

(model > Contact.java )

 

변수처리를 해줌으로써, 앞으로 작성할 코드를 더 말끔하게 처리할 수 있다.

자바는 객체지향 프로그램이다. Class로 만들어 작업하여 메모리에 올려준다.

테이블 -> 영구저장

변수 -> 메모리에 저장


데이터베이스 데이터타입

SQLite의 데이터타입은 MySQL과는 조금 다르니 하기표를 참고하면 좋다.

예를 들면, MySQL문에서 VARCHAR는 SQLite에서 text로 사용된다.

Data Type Explanation
null Includes any NULL values.
integer 정수형 컬럼
real 소수점이 있는 숫자형
text 문자형 컬럼

이 외에도 BLOB, NUMERIC등이 있지만 주로 상기 데이터타입을 사용한다.


데이터 CRUD 명령어

Create,Read,Update,Delete

 

SQL 명령 설명
SELECT Read 데이터 조회
SELECT 컬럼 FROM 테이블명 WHERE 조건
INSERT Create 데이터 삽입
INSERT INTO 테이블명 VALUES (데이터)
UPDATE Update 데이터 수정
UPDATE 테이블명 SET 컬럼 = 데이터 WHERE 조건
DELETE Delete 데이터 삭제
DELETE FROM 테이블명 WHERE 조건

데이터베이스/테이블 생성 

 

CREATE TABLE 테이블명 (
      [컬럼명1]  [타입]  [옵션], [컬럼명2]  [타입], [컬럼명3]  [타입]  [옵션]
       )

컬럼은 [컬럼명]  [타입]  [옵션] 의 순서대로 작성하고, 공백으로 구분한다.컬럼이 2개 이상이면 쉼표로 컬럼을 구분한다. 컬럼에 따라 옵션이 없는 경우도 있다. 

 

  • SQLite를 사용하기 위해서는 안드로이드의 컨텍스트가 가지고 있는 createDatabase() 메서드를 사용하거나, SQLiteOpenHelper 클래스를 상속받아서 사용할 수 있다.
  • SQLiteOpenHelper 클래스를 상속받아서 사용하는 방법이 사용성이 더 좋고 쉽다.

 

SQLiteOpenHelper 클래스는 데이터베이스를 파일로 생성하고 자바 코드에서 사용할 수 있도록 데이터베이스와 연결하는 역할을 한다.

 

앞서 언급했던 SELECT쿼리도 Helper 클래스를 통해서 실행한 후 결과 데이터를 반환받게 된다. 

 

새로운 SQLite 프로젝트를 하나 생성해본다.

 

 
public class DatabaseHandler extends SQLiteOpenHelper {

       // DB의 이름을 정해준다. 
    public DatabaseHandler(@Nullable Context context) {
        super(context, Util.DATABASE_NAME, null, Util.DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
         // 테이블 생성
        String CREATE_CONTACT_TABLE = "create table " + Util.TABLE_NAME + "("+
                    Util.KEY_ID + " integer primary key, " +
                    Util.KEY_NAME + " text, " +
                    Util.KEY_PHONE + " text )";

        Log.i("MyContact", "테이블 생성문 : " + CREATE_CONTACT_TABLE);

        sqLiteDatabase.execSQL(CREATE_CONTACT_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        // 기존의 contact 테이블을 삭제,
        String DROP_TABLE = "drop table " +Util.TABLE_NAME;
        sqLiteDatabase.execSQL(DROP_TABLE, new String[]{Util.DATABASE_NAME});
      // 위 쿼리문 실행, 데이터베이스 사용하는 법: new String 배열, 그리고 이름

        // 새롭게 테이블을 다시 만든다.
        onCreate(sqLiteDatabase);
    }

(data>DatabaseHandler.java )

 

    public DatabaseHandler(@Nullable Context context) {
        super(context, Util.DATABASE_NAME, null, Util.DATABASE_VERSION);
    }
  • SQLiteOpenHelper는 생성 시에, Context, 데이터베이스명, 팩토리, 버전 정보가 필요하다
  • 팩토리는 사용하지 않아도 되므로, 나머지 세가지 정보를 내가 만든 클래스의 생성자에 파라미터로 정의한 후, 상속받은 SQLiteOpenHelper에 전달한다.
  • 여기서는, 데이터베이스명, 버전정보는 사전 설정해두었으므로, 매개변수는 context만 받도록 해놓았다. 

 그리고 추상 클래스이므로, “ctrl + I”를 입력하여, 2개의 메서드를 선택하고 OK를 누른다. 

2개의 메서드가 자동으로 생성된다: onCreate()와 onUpgrade()이다. 

TODO가 입력된 행은 삭제한다. 

생성되는 메서드의 첫번째 파라미터로 우리가 사용할 데이터베이스가 전달된다. 

 

onCreate() 메서드

해당 메서드에서 테이블을 생성한다. MYSQL과 흡사한 SQL문을 작성하면 된다.

이 메서드 안에 문자열로 테이블 생성쿼리를 작성하고 실행하면 된다. 

데이터베이스가 생성되어 있으면 더이상 실행되지 않는다. 

DB를 생성한 후, execSQL() 메서드에 전달해서 실행한다. 

 

ID는 Integer타입과 주요키로 지정한다.

NAME,PHONE은 Text타입으로 저장한다.

 

onUpgrade()메서드

 SQLiteOpenHelper에 전달되는 버전 정보가 변경되었을 때 현재 생성되어 있는 데이터베이스의 버전과 비교해서 더 높으면 호출된다. 버전 변경 사항이 없으면 호출되지 않는다. 

 

context란

  컨텍스트는 시스템을 사용하기 위한 정보(프로퍼티)와 도구(메서드)가 담겨있는 클래스이다. 대부분의 컨텍스트는 컴포넌트 실행(runtime)시 함께 생성되고, 생성된 컴포넌트가 가지고 있는 메서드를 호출해서 각각의 도구를 사용할 수 있다. 

  안드로이드에서의 컨텍스트는 앱을 실행하기 위해 잘 짜여진 설계도의 개념으로 앱에서 사용하는 기본 기능이 담겨있는 기본 클래스(Base Class)이다. 액티비티는 컨텍스트를 상속받아 구현된다. 

반응형