Concepts of SQLite
1. SQLite
- 데이터베이스로 데이터를 영속화
- File Read/Write : 이미지
- Preference : 앱 설정
- Database : 구조화된 대량의 어플리케이션 데이터 저장 및 관리, 데이터 캐싱
- SQLite(www.sqlite.org)은 오픈소스로 만들어진 데이터베이스로 관계형 데이터베이스, 안드로이드의 로컬 DB
- SQLite Database는 별도의 프로세스가 아닌 라이브러리를 사용 → connection 개념X
- 데이터베이스는 생성한 어플리케이션의 일부로 통합
- SQLite를 이용한 데이터는 (내장 메모리의)파일에 저장되며 /data/data/<package_name>/databases 폴더에 저장
SQLiteOpenHelper
1. SQLiteOpenHelper
- 데이터베이스 프로그래밍에 필요한 클래스
- SQLiteDatabase 객체 이용은 필수
- SQLiteOpenHelper 클래스는 앱을 위한 데이터베이스의 관리적인 코드(테이블을 create, alter, drop)를 한 곳으로 추상화 시킬 목적
1) SQLiteOpenHelper 클래스를 상속받아 작성
class DBHelper(context: Context): SQLiteOpenHelper(context, "testdb", null, 1){
...
}
2) SQLiteOpenHelper 오버라이드 함수 작성
- onCreate() : 앱이 인스톨된 후 최초로 SQLiteOpenHelper 클래스가 이용되는 순간 한번 호출, 대부분 table create
- onUpgrade() : SQLiteOpenHelper의 생성자에 지정한 DB 버전 정보가 변경될 때마다 호출, 대부분 schema 변경
3) 실제 sql문을 실행하기 위한 SQLiteDatabase 객체를 SQLiteOpenHelper 클래스로 획득
- SQLiteOpenHelper의 readableDatabase 혹은 writableDatabase 프로퍼티로 SQLiteDatabase 객체를 획득
val db: SQLiteDatabase = DBHelper(this).writableDatabase
rawQuery, execSql
1. SQLiteDatabase
- SQLite를 이용하기 위한 최소한의 API
- SQLiteOpenHelper 객체를 이용해 획득
- OpenHelper를 이용하지 않는 경우 openOrCreateDatabase() 함수를 이용해 획득
val db = openOrCreateDatabase("testdb", Context.MODE_PRIVATE, null)
- public void execSQL(String sql, Object[] bindingArgs)
- select를 제외한 나머지 SQL문을 실행하기 위한 함수
- sql의 데이터가 들어가는 부분을 물음표(?)로 표현했다면 두번째 매개변수에서 물음표 갯수만큼 배열 정보를 줘서 물음표의 데이터에 대입되도록 함
db.execSQL("create table USER_TB ("+
"_id integer primary key autoincrement,"+
"name not null,"+
"phone)")
db.execSQL("insert into USER_TB (name, phone) values (?, ?)", arrayOf<String>("minha", "01012345678"))
- public Cursor rawQuery(String sql, String[] selectionArgs)
- select문을 실행하기 위한 함수(select문은 return 값 때문에 따로 존재함)
- sql문에 물음표가 들어간다면 두번째 매개변수에서 물음표 갯수만큼 해당 값을 주면 됨
val cursor = db.rawQuery("select * from USER_TB", null)
2. Cursor
- rawQuery() 함수의 리턴 값은 Cursor 객체이며 select된 row의 집합 객체
- Cursor 객체를 움직여 row를 선택하고 선택된 row의 column data를 획득
- 아래의 함수를 이용해서 선택하면 true, 선택하지 못하면 false 리턴
- public abstract boolean moveToFirst() : 첫번째 row
- public abstract boolean moveToLast() : 마지막 row
- public abstract boolean moveToNext() : 순서상으로 다음 row
- public abstract boolean moveToPosition(int position) : 특정 위치의 row
- public abstract boolean moveToPrevious() : 순서상으로 이전 row
while(cursor.moveToNext()){
val name = cursor.getString(0)
val phone = cursor.getString(1)
}
insert, update, delete, query
1. SQLiteDatabase
- 앞서 살펴 본 rawQuery(), execSql()로 SQL문을 실행할 수 있음
- 하지만 이 함수들을 사용하는 경우 오타가 나지 않도록 유의해야 함
- insert(), update(), delete(), query() 함수로도 SQL문을 실행할 수 있음
- 이 함수들을 사용하면 직접 SQL문을 작성하는 것이 아니라 SQL문을 만들어야 되는 데이터를 매개변수로 주면 자체적으로 SQL문을 만들어 실행시켜 줌
- 함수 사용
- public long insert(String table, String nullColumnHack, ContentValues values)
- insert문, (테이블명, 값을 입력할 컬럼명, 값)
- public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
- update문, (테이블명, 값을 입력할 컬럼명, where절, whereClause에 데이터 자리를 ?로 표현했을 때 ?에 들어갈 데이터))
- public int delete(String table, String whereClause, String[] whereArgs)
- delete문, (테이블명, where절, whereClause에 데이터 자리를 ?로 표현했을 때 ?에 들어갈 데이터)
- public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
- select문, (테이블명, 컬럼명, where절, selection에 데이터 자리를 ?로 표현했을 때 ?에 들어갈 데이터, group by절, having절, order by절)
2. ContentValues
- ContentValues는 insert와 update 함수에 들어가는 컬럼 데이터를 표현하는 것
- Map 객체처럼 key-values 형태로 데이터 여러건을 ContentValues에 등록
val values = ContentValues()
values.put("name", "minha")
values.put("phone", "01012345678")
db.insert("USER_TB", null, values)