Android(Java) - SQLiteOpenHelper - SQLite3 DB 사용 방법

반응형

 

SQLiteOpenHelper

  • 데이터베이스 SQLite를 다루는 추상 클래스
  • 상속 받는 클래스는 생성자와 추상 메소드를 정의하여 사용

SQLiteOpenHelper 상속

  • SQLiteOpenHelper 클래스를 상속 받아 DB를 SQLite로 편리하게 제어 할 수 있음

 

  • 상속 받을 클래스 정의
    • 임의의 클래스 이름 : DatabaseHandler
public class DatabaseHandler extends SQLiteOpenHelper {

}

 

  • 추상 메소드 정의 및 기본 구성
public class DatabaseHandler extends SQLiteOpenHelper {
    // 데이터베이스 SQL 다루는 클래스
    // SQLiteOpenHelper 추상클래스를 상속 받는 클래스, 추상 메소드 정의

    // 데이터베이스 설정
    public DatabaseHandler(@Nullable Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    
    // 테이블을 설정하는 메소드
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
    }
    
    // 데이터베이스를 제어하는 메소드
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }

추상 메소드 정의

onCreate

  • 테이블을 설정하는 메소드, 처음 실행 될 때 한번만 실행
  • TABLE_NAME, KEY_ID, KEY_NAME, KEY_PHONE은 임의의 변수
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    // SQLite : VARCHAR -> text
    String CREATE_CONTACT_TABLE = "create table " + TABLE_NAME
            + "(" + KEY_ID + " integer primary key, "
            + KEY_NAME + " text, "
            + KEY_PHONE + " text )";

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

    // SQL문 실행 명령어
    sqLiteDatabase.execSQL(CREATE_CONTACT_TABLE);
}

 

onUpgrade

  • DB를 제어하는 메소드
  • 아래의 예시 소스 코드에서는 기존의 테이블을 삭제하고 새로운 테이블을 생성하도록 구현
  • TABLE_NAME, DATABASE_NAME은 임의의 변수
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    // 기존의 테이블을 삭제하고 새로운 테이블 생성
    String DROP_TABLE = "drop table " + TABLE_NAME;
    sqLiteDatabase.execSQL(DROP_TABLE, new String[]{DATABASE_NAME});
    onCreate(sqLiteDatabase);
}

추가 메소드 정의 (CRUD)

  • 새로운 메소드를 정의하여 다양한 DB 관리 기능을 구현 할 수 있음
  • 이번 포스팅에서 정의되는 메소드들은 주소록 관련 DB 기능을 구현

새로운 클래스에 DB 접근시 필요한 데이터들 정의

  • 주소록을 저장 할 Concat 클래스 정의
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;
    }
}

READ

  • Contact 클래스의 변수들 이용(id, name, phone)
// 주소록 데이터 가져오기
// - 1개의 주소록 데이터만 가져오기 : id로 가져오기 select * from contact where id = n;
public Contact getContact(int id){
    // 데이터 베이스 호출
    SQLiteDatabase db = this.getWritableDatabase();

    // SQL 쿼리문 작성
    Cursor cursor = db.rawQuery("select * from contact where id = " + id, null);
    // Cursor cursor = db.rawQuery("select * from contact where id = ?", new String[]{""+id});

    if (cursor != null) {
        cursor.moveToFirst();
    }

    // 인덱스의 첫번째 컬럼(id)를 가져오는 방법
    // cursor.getInt(0); or getString(0)

    // DB 데이터를 메모리에 저장하고 CPU 로 처리
    Contact contact = new Contact(cursor.getInt(0), cursor.getString(1), cursor.getString(2));
    contact.id = cursor.getInt(0);
    contact.name = cursor.getString(1);
    contact.phone = cursor.getString(2);

    cursor.close();

    return contact;
}

// - 주소록 전체 데이터 가져오기 : select * from contact;
public ArrayList<Contact> getAllContact() {
    // 데이터 베이스 호출
    SQLiteDatabase db = this.getWritableDatabase();

    // SQL 쿼리문 작성
    Cursor cursor = db.rawQuery("select * from contact", null);
    // Cursor cursor = db.rawQuery("select * from contact where id = ?", new String[]{""+id});

    ArrayList<Contact> contactList = new ArrayList<>();

    cursor.moveToFirst();
    for (int i=0; i<cursor.getCount(); i++) {
        // DB 데이터를 메모리에 저장하고 CPU 로 처리
        Contact contact = new Contact(cursor.getInt(0), cursor.getString(1), cursor.getString(2));
        contactList.add(contact);
        cursor.moveToNext();
    }

// 위의 for 와 같은 의미
//    if(cursor.moveToFirst()) {
//        do {
//            Contact contact = new Contact(cursor.getInt(0), cursor.getString(1), cursor.getString(2));
//            contactList.add(contact);
//        } while(cursor.moveToNext());
//    }

    cursor.close();

    return contactList;
}

INSERT

  • KEY_NAME, KEY_PHONE, TABLE_NAME은 임의의 변수
  • Contact 클래스의 변수들 이용(name, phone)
public void addData(Contact contact){
    // 데이스베이스 호출
    SQLiteDatabase db = this.getWritableDatabase();

    // 데이터베이스 insert
    ContentValues values = new ContentValues();
    values.put(KEY_NAME, contact.name); // KEY_NAME = "name"
    values.put(KEY_PHONE, contact.phone); // KEY_PHONE = "phone"
    db.insert(TABLE_NAME, null, values); // TABLE_NAME = "contact"

    // 자원 해제
    db.close();
}

UPDATE

  • KEY_NAME, KEY_PHONE은 임의의 변수
  • Contact 클래스의 변수들 이용(id, name, phone)
public void updateContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_NAME, contact.name); // KEY_NAME = "name"
    values.put(KEY_PHONE, contact.phone); // KEY_PHONE = "phone"

    // db.update(Util.TABLE_NAME, values, Util.KEY_ID + "=?", new String[]{contact.id+""});
    db.execSQL("update contact set name = ?, phone = ? where id = ?", new String[]{contact.name, contact.phone, contact.id+""});
    db.close();
}

DELETE

  • Contact 클래스의 변수 이용(id)
public void deleteContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();

    db.execSQL("delete from contact where id = ?", new String[]{contact.id+""});
    db.close();
}
반응형