[안드로이드 프로그래밍] SQLite 데이터베이스

PUJIN·2023년 7월 24일
0

android programming

목록 보기
19/26
post-thumbnail

SQLite 데이터 베이스


안드로이드 내장 데이터 베이스

  • 표준 SQL문 사용하는 관계형 데이터 베이스



SQLite OpenHelper


SQLite 데이터 베이스를 사용하기 위해서는 SQLiteOpenHelper를 상속받는 클래스 필요

  • 두번째 매개변수 : 사용할 데이터 베이스 파일 이름
  • 세번째 매개변수 : NullFactory, null에 대한 처리
    • null 세팅
class DBHelper(context:Context) : SQLiteOpenHelper(context, "Test.db", null, 1) { }

  • onCreate : 테이블 생성 작업 수행
    • 데이터 베이스 파일이 없으면 파일을 만들고 해당 메서드 호출

create table 테이블 이름
(컬럼이름 자료형 제약조건)

  • 자료형
    • 정수 : integer
    • 문자열 : text
    • 실수 : real
    • 날짜 : date
  • 제약 조건 : 저장할 수 있는 값에 대한 조건
    • primary key : null 값 허용 X, 중복된 값 허용 X
      • 각 행을 개별적으로 구분하는 값으로 사용
    • autoincrement : 컬럼에 저장할 값을 지정하지 않은 경우 1부터 1씩 증가하는 값 자동 저장
    • not null : null 값 허용 X
      • 무조건 값 지정해줘야 한다.
override fun onCreate(sqliteDatabase: SQLiteDatabase?) {

	// 테이블 구조 정의
	val sql = """create table TestTable
		(idx integer primary key autoincrement,
		textData text not null,
		intData integer not null,
		doubleData real not null,
		dateData date not null)
	""".trimIndent()

	// 쿼리문 수행
	sqliteDatabase?.execSQL(sql)
}

  • onUpgrade : 사용하는 데이터 베이스 파일 버전이 변경되어 있을 때 호출되는 메서드
    • 부모 생성자의 마지막 매개변수인 버전 번호가 데이터 베이스 파일에 기록 버전보다 높을 때 호출
    • 과거에 만들어진 테이블을 현재의 구조가 될 수 있도록 테이블을 수정하는 작업
override fun onUpgrade(sqliteDatabase: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
	TODO("Not yet implemented")
}

⌨️ 전체 코드

class DBHelper(context:Context) : SQLiteOpenHelper(context, "Test.db", null, 1) {

	override fun onCreate(sqliteDatabase: SQLiteDatabase?) {

        val sql = """create table TestTable
            (idx integer primary key autoincrement,
            textData text not null,
            intData integer not null,
            doubleData real not null,
            dateData date not null)
        """.trimIndent()

        sqliteDatabase?.execSQL(sql)
    }

    override fun onUpgrade(sqliteDatabase: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        TODO("Not yet implemented")
    }
}



DAO.kt


  • create : 저장
    • contentValues : 컬럼 이름과 데이터를 설정하는 객체
      • put : 컬럼 이름, 값 설정
        • autoincrement 컬럼 제외 후 나머지 컬럼만 지정
    • insert(데이터를 저장할 테이블 이름, null 처리 방법, contentValues)
      • null 처리 방법 : null 입력
      • contentValues : 저장할 데이터를 가지고 있는 객체
fun insertData(context: Context, data:TestClass ){
	
	val contentValues = ContentValues()
	
	contentValues.put("textData", data.textData)
	contentValues.put("intData", data.intData)
	contentValues.put("doubleData", data.doubleData)
	contentValues.put("dateData", data.dateData)

	val dbHelper = DBHelper(context)

	dbHelper.writableDatabase.insert("TestTable", null, contentValues)
    
	dbHelper.close()
}

  • Read Condition : 조건에 맞는 행 하나 가져오기
    • query
      • 첫번째 매개변수 : 테이블명
      • 두번째 매개변수 : 가져오려는 컬럼 이름 목록
        • null인 경우 : 모두 가져온다.
      • 세번째 매개변수 : 특정 행을 선택하기 위한 조건절
      • 네번째 매개변수 : 조건절의 ?에 세팅될 값 배열
      • 다섯번째 매개변수 : Group by 기준 컬럼
      • 여섯번째 매개변수 : Having절에 들어갈 조건절
      • 일곱번째 매개변수 : Having절의 ?에 세팅될 값 배열
fun selectData(context: Context, idx:Int):TestClass{

	val dbHelper = DBHelper(context)
           
	val selection = "idx = ?"
	val args = arrayOf("$idx")
	val cursor = dbHelper.writableDatabase.query("TestTable", null, selection, args, null, null, null)

	cursor.moveToNext()

	// 컬럼의 이름을 지정하여 컬럼의 순서값을 가져오기
	val idx1 = cursor.getColumnIndex("idx")
	val idx2 = cursor.getColumnIndex("textData")
	val idx3 = cursor.getColumnIndex("intData")
	val idx4 = cursor.getColumnIndex("doubleData")
	val idx5 = cursor.getColumnIndex("dateData")

	val idx = cursor.getInt(idx1)
	val textData = cursor.getString(idx2)
	val intData = cursor.getInt(idx3)
	val doubleData = cursor.getDouble(idx4)
	val dateData = cursor.getString(idx5)

	val testClass = TestClass(idx, textData, intData, doubleData, dateData)

	dbHelper.close()
    
	return testClass
}

  • Read All : 모든 행 가져오기
    • query
      • 첫번째 매개변수 : 테이블명
      • 두번째 매개변수 : 가져오려는 컬럼 이름 목록
        • null인 경우 : 모두 가져온다.
      • 세번째 매개변수 : 특정 행을 선택하기 위한 조건절
      • 네번째 매개변수 : 조건절의 ?에 세팅될 값 배열
      • 다섯번째 매개변수 : Group by 기준 컬럼
      • 여섯번째 매개변수 : Having절에 들어갈 조건절
      • 일곱번째 매개변수 : Having절의 ?에 세팅될 값 배열
    • cursur 객체 : 쿼리문에 맞는 행에 접근할 수 있는 객체
      • 처음에는 아무 행도 가르키고 있지 않다.
      • moveToNext : 다음 행에 접근
        • 접근할 행이 있는 경우 : true 반환
        • 접근할 행이 있는 경우 : false 반환
fun selectAllData(context: Context):MutableList<TestClass>{
	val dbHelper = DBHelper(context)
	val cursor = dbHelper.writableDatabase.query("TestTable", null, null, null, null, null, null)

	val dataList = mutableListOf<TestClass>()

	while(cursor.moveToNext()){
		// 컬럼의 이름을 지정하여 컬럼의 순서값을 가져오기
		val idx1 = cursor.getColumnIndex("idx")
		val idx2 = cursor.getColumnIndex("textData")
		val idx3 = cursor.getColumnIndex("intData")
		val idx4 = cursor.getColumnIndex("doubleData")
		val idx5 = cursor.getColumnIndex("dateData")

		val idx = cursor.getInt(idx1)
		val textData = cursor.getString(idx2)
		val intData = cursor.getInt(idx3)
		val doubleData = cursor.getDouble(idx4)
		val dateData = cursor.getString(idx5)

		val testClass = TestClass(idx, textData, intData, doubleData, dateData)
		dataList.add(testClass)
	}

	dbHelper.close()

	return dataList
}

  • Update : 조건에 맞는 행의 컬럼 값 수정
    • contentValues : 컬럼 이름과 데이터를 설정하는 객체
      • put : 컬럼 이름, 값 설정
        • autoincrement 컬럼 제외 후 나머지 컬럼만 지정
    • update
      • 첫번째 매개변수 : 테이블명
      • 두번째 매개변수 : content values
      • 세번째 매개변수 : 특정 행을 선택하기 위한 조건절
      • 네번째 매개변수 : 조건절의 ?에 세팅될 값 배열
fun updateData(context:Context, obj:TestClass){

	contentValues.put("textData", obj.textData)
	contentValues.put("intData", obj.intData)
	contentValues.put("doubleData", obj.doubleData)
	contentValues.put("dateData", obj.dateData)
            
	val condition = "idx = ?"
    // ?에 들어갈 값
	val args = arrayOf("${obj.idx}")

	val dbHelper = DBHelper(context)

	dbHelper.writableDatabase.update("TestTable", contentValues, condition, args)
    
	dbHelper.close()
}

  • Delete : 조건에 맞는 행 삭제
    • delete
      • 첫번째 매개변수 : 테이블명
      • 두번째 매개변수 : 특정 행을 선택하기 위한 조건절
      • 세번째 매개변수 : 조건절의 ?에 세팅될 값 배열
fun deleteData(context:Context, idx:Int){
            
	val condition = "idx = ?"
    // ?에 들어갈 값
	val args = arrayOf("$idx")

	val dbHelper = DBHelper(context)
	
    dbHelper.writableDatabase.delete("TestTable", condition, args)
	
    dbHelper.close()
}

0개의 댓글