Deperecated/Android_강의

안드로이드 - SQLite 데이터베이스(1)

누알라리 2020. 2. 19. 23:06
1. SQLite 데이터 베이스

- 안드로이드에서 사용하는 내장 데이터 베이스로 표준 SQL문을 사용하는 관계형 DB이다.

- MySQL과 유사한 문법을 사용하고 있으며 일반적인 관계형 DB가 가지고 있는 기능을 갖고 있다.

- 애플리케이션의 내부저장소에 생성된다.

 

2. DB 생성

1. SQLiteOpenHelper을 상속하는 DBHelper 클래스를 생성한다.

// 1. 클래스 생성
// (부모 클래스 4개 생성자)
// name : DB의 이름.
// version : DB파일의 기록. (이전 데이터는 날아가면 안되니까)
// 유지보수 단계에서 DB를 바꿀경우 version 숫자를 바꾸고, 바꾸면 onUpgrade()가 호출된다.
class DBHelper(context : Context) : SQLiteOpenHelper(context, "Test.db", null, 1)

- 생성 시 부모 클래스의 생성자를 같이 정의해준다.

- SQLiteOpenHelper(Context, "생성할 DB의 이름", null, "생성할 DB의 버전)

 

2. onCreate() or onOpen()

- "생성할 DB의 이름"을 가진 DB가 이미 있으면 onOpen()이 호출된다.

- 없으면 onCreate()가 호출된다.

 

- onCreate()는 DB에 들어갈 테이블을 생성하는 함수라 쿼리문을 작성 후 DB에 넣어주어야 한다.

    // 2. "Test.db"가 이미 있으면 OnCreate() 바로 호출, 없으면 생성 후 Open() 호출.
    // DB에 들어갈 테이블을 생성하는 함수.
    override fun onCreate(db: SQLiteDatabase?) {
        Log.d("test1", "on create")

        // 3. 쿼리문 생성 후 DB에 넣어준다.
        var sql = "create table TestTable (" +
                "idx integer primary key autoincrement, " +
                "textData text not null," +
                "intData integer not null," +
                "floatData real not null," +
                "dataData date not null" +
                ")"

        db?.execSQL(sql)
    }

 

2. DB 오픈/닫음

- MainActivity에서 DBHelper 객체를 만들고, writableDatabase로 DB를 가져올 수 있다.

        button.setOnClickListener { view ->

            // 5. DB 오픈
            var helper = DBHelper(this)
            var db = helper.writableDatabase


            db.close()
        }

 

3. DB 버전 업그레이드

- SQLiteOpenHelper를 생성자로 초기화할 때 마지막인자로 "DB의 버전"이 들어간다.

- 예를들어 유지보수 할 때, DB를 업데이트 할 때 버전을 나누어서 관리하기 위함이다.

 

- DB의 버전이 바뀌면 onUpgrade()가 자동으로 호출되고 버전이 바뀔 때 적용할 쿼리문을 작성할 수 있다.

class DBHelper(context : Context) : SQLiteOpenHelper(context, "Test.db", null, 1)
->
class DBHelper(context : Context) : SQLiteOpenHelper(context, "Test.db", null, 2)



   // 유지보수 단계에서 DB를 바꿀경우 version 숫자를 바꾸고, 바꾸면 onUpgrade()가 호출된다.
    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        Log.d("test1", "OldBersion : ${oldVersion}, newversion  ${newVersion}")
    }

 

4. 테이블에 데이터 추가
        button.setOnClickListener { view ->

            // 5. DB 오픈
            var helper = DBHelper(this)
            var db = helper.writableDatabase

            // 6. sql 쿼리 작성
            var sql = "insert into TestTable (textData, intData, floatData, dataData) values (?, ?, ?, ?)"


            // 날짜(date)를 패턴으로 지정한 문자열로 뽑아낼 수 있는것
            var sdf = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
           var date = sdf.format(Date())

            // 7. 쿼리에 들어갈 데이터 세팅
            var arg1 = arrayOf("문자열1", "100", "11.11", date)
            var arg2 = arrayOf("문자열2", "200", "22.22", date)

            db.execSQL(sql, arg1)
            db.execSQL(sql, arg2)

            db.close()

            textView.text = "저장 완료"
        }

 

5. 테이블에서 데이터 추출

1. 데이터를 추출할 커서 클래스 타입을 가져온다. (db.rawQuery)

2. moveToNext()

- 다음 row(열)로 계속 넘어간다. 더이상 접근할 열이 없으면 false를 리턴한다.

3. Column명을 넣어 데이터를 추출한다.

- 각 column(행)의 데이터를 바로 가져올 수 없고, column의 이름을 던져서 해당 칼럼이 몇번째 인덱스인지 받아오고, 그 인덱스가 가진 데이터를 가져와야 한다.

       button2.setOnClickListener { view ->

            var helper = DBHelper(this)
            var db = helper.writableDatabase

            var sql = "select * from TestTable"

            // 커서 클래스타입의 객체는 select해서 가져올 수 있는 객체의 클래스 타입이다.
            var c: Cursor = db.rawQuery(sql, null)

            textView.text = ""

            // 현재에서 다음 row(열)로 계속 넘어간다. 더이상 접근할게 없으면 false.
            // 각 column(행)의 데이터를 가져오려면 column의 이름을 던져서 해당 컬럼이 몇번째 인덱스인지 받아오고, 그 인덱스가 가진 데이터를 가져와야한다.
            while(c.moveToNext())
            {

                var idx_pos = c.getColumnIndex("idx")
                var textData_pos = c.getColumnIndex("textData")
                var intData_pos = c.getColumnIndex("intData")
                var floatData_pos = c.getColumnIndex("floatData")
                var DateData_pos = c.getColumnIndex("dataData")

                var idx = c.getInt(idx_pos)
                var textData = c.getString(textData_pos)
                var intData = c.getInt(intData_pos)
                var floatData = c.getDouble(floatData_pos)
                var dateData = c.getString(DateData_pos)

                textView.append("idx : ${idx}\n")
                textView.append("textData : ${textData}\n")
                textView.append("intData : ${intData}\n")
                textView.append("floatData : ${floatData}\n")
                textView.append("dateData : ${dateData}\n")

            }

            db.close()
        }

 

6. 데이터 업데이트
        // 8. 데이터 업데이트
        button3.setOnClickListener { view ->
            var helper = DBHelper(this)
            var db = helper.writableDatabase

            var sql = "update TestTable set textData=? where idx=?"
            var args = arrayOf("문자열3", "1")
            db.execSQL(sql, args)

            db.close()

            textView.text = "수정 완료"
        }

 

7. 데이터 삭제
        // 9. 데이터 삭제
        button4.setOnClickListener { view ->
            var helper = DBHelper(this)
            var db = helper.writableDatabase

            var sql = "delete from TestTable where idx =?"
            var args = arrayOf("1")

            db.execSQL(sql, args)
            db.close()

            textView.text = "삭제완료"
        }
        

 

8. 쿼리문에 따른 사용할 메서드

1. SELECT

- db.rawQuery()

 

2. INSERT, UPDATE, DELETE

- execSQL()