안드로이드 13) SQLite

밍나·2022년 1월 21일
0

Android

목록 보기
13/36

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()){
// cursor 객체를 움직여 row를 선택하고 column 데이터는 getter 함수로 획득
// getter 함수의 매개변수는 select 된 column의 index 값
    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에 등록
    • 이 때 key값은 column명
val values = ContentValues()
values.put("name", "minha")
values.put("phone", "01012345678")
db.insert("USER_TB", null, values)
profile
🤗🤗🤗

0개의 댓글