반응형
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();
}
반응형