Database란?
어플리케이션의 데이터를 저장할 때 서버를 통해 저장할 수도 있지만, 기기에 저장할 수도 있다.
안드로이드에서는 SharedPreference를 사용하여 (key,value) 형태로 데이터를 저장할 수 있는 기능을 제공한다.
하지만 단순한 형태로만 저장할 수 있기 때문에 복잡한 데이터를 저장하기에는 불편함이 따른다.
이 때, Database를 사용하면 더 체계적인 형태로 데이터를 저장할 수 있다.
안드로이드에서는 SQLite라는 임베디드 데이터베이스를 사용한다.
SQLite는 관계형 데이터베이스로 Table의 형태로 데이터를 저장하며 SQL문을 통해 기능을 수행한다.
따라서 관계형 데이터베이스에 대한 지식과 SQL 문법에 대한 기본적인 지식이 필요하다.
그 내용은 아래 글을 참고하자.
관계형 데이터베이스(Relational Database)
SQL 문법
Database 생성 또는 열기
public void openDatabase(String databaseName){
println("openDatabase() called");
database = openOrCreateDatabase(databaseName, MODE_PRIVATE, null);
if(database != null) println("database opened");
}
먼저 데이터베이스를 사용하기 위해 데이터베이스를 열어주어야 한다.
기본적으로 openOrCreateDatabas() 함수를 통해 가능하며 SQLiteDatabase 객체로 database를 넘겨준다.
파라미터로는 데이터베이스의 이름, 실행할 모드(주로 Private), 그리고 CursorFactory를 넣어주면 된다.
※ println()은 TextView에 로그 기록을 띄워주기 위해 만들어준 함수이다.
Table 만들기 (CREATE)
public void createTable(String tableName){
println("createTable() called");
if(database != null){
String sql = "CREATE TABLE " + tableName + "("
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "name TEXT,"
+ "age INT,"
+ "mobile TEXT"
+ ")";
database.execSQL(sql);
println("table created");
} else {
println("open database first");
}
}
데이터베이스에 접근하기 전 데이터베이스를 제대로 불러왔는지 database 객체를 확인해준다.
그리고 테이블을 생성하는 SQL을 작성하여 execSQL() 함수를 통해 실행하면 된다.
Data 추가하기 (INSERT)
public void insertData(String name, int age, String mobile){
println("insertData() called");
if(database != null){
String sql = "INSERT INTO customer(name, age, mobile) VALUES(?, ?, ?)";
Object[] params = {name, age, mobile};
database.execSQL(sql, params);
println("data inserted");
} else {
println("open database first");
}
}
다음으로 데이터를 추가하기 위해 SQL 문을 작성해준다.
이 때 VALUES 부분에 ? 라는 값을 넣어주었는데 이는 변수로서 SQL 실행 시 별도로 첨부할 수 있다.
Object 배열을 만들어준 뒤, SQL 변수에 들어갈 변수들을 차례대로 넣어주자.
그리고 execSQL() 함수를 통해 SQL을 실행할 때 두번째 파라미터로 넘겨주면 된다.
데이터 불러오기 (SELECT)
public void selectData(String tableName){
println("selectData() called");
if(database != null){
String sql = "SELECT name, age, mobile FROM " + tableName;
Cursor cursor = database.rawQuery(sql, null); // return 값이 있는 경우
println(cursor.getCount() + " rows found");
int idx = 0;
while(cursor.moveToNext()){
String name = cursor.getString(0);
String age = cursor.getString(1);
String mobile = cursor.getString(2);
println("#" + ++idx + " -> " + name + ", " + age + ", " + mobile);
}
cursor.close();
} else {
println("open database first");
}
}
데이터를 불러오는 건 테이블명을 넘겨받아 쿼리를 작성해주자.
이 때 rawQuery() 함수를 통해 sql을 실행하게 되는데, 이 함수는 execSQL()과 달리 반환받을 값이 있을 때 사용한다.
rawQuery() 함수를 통해 쿼리가 정상적으로 실행됐다면 Cursor 객체를 넘겨받을 수 있다.
이 Cursor 객체를 통해 데이터베이스에서 받아온 데이터들에 접근할 수 있다.
moveToNext() 함수를 실행하면 데이터의 다음 row를 불러오고, 끝이라면 0이 반환된다.
그리고 cursor.getString() 함수에 column의 index를 넣어주어 원하는 column의 값에 접근할 수 있다.
모든 데이터를 읽었다면 cursor.close()를 통해 닫아주자.
실행해보면 정상적으로 데이터가 저장되고 읽히는 것을 볼 수 있다.
Reference
[부스트코스]안드로이드 프로그래밍
'Android > Concepts' 카테고리의 다른 글
Device의 Network 상태 가져오기 (0) | 2020.05.01 |
---|---|
SQLiteOpenHelper 사용하여 DB 수정하기 (0) | 2020.05.01 |
Glide 라이브러리 사용법 (0) | 2020.04.30 |
서버로부터 Bitmap 이미지 받아오기 (0) | 2020.04.27 |
Gson을 이용하여 Json 파싱하기 (0) | 2020.04.27 |