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()
'Deperecated > Android_강의' 카테고리의 다른 글
안드로이드 - Content Provider (0) | 2020.02.20 |
---|---|
안드로이드 - SQLite 데이터베이스(2) (0) | 2020.02.19 |
안드로이드 - 데이터 관리 - 파일 입출력 (0) | 2020.02.19 |
안드로이드 - DialogFragment (0) | 2020.02.19 |
안드로이드 - ListFragment (0) | 2020.02.19 |