반응형

데이터베이스는 테이블들을 담고 있는 그릇 역할을 합니다.

이 안에 여러 개의 테이블을 만들 수 있죠.

데이터베이스를 사용하고 싶다면 먼저 데이터베이스가 어떤 것인지 이해하는 과정이 필요합니다.

그 다음에는 직접 사용해보는 것이 필요합니다.

일단 데이터베이스라는 것이 어떻게 만들어지고 테이블을 어떻게 만들 수 있는지를 알아야 그 안에 데이터를 넣거나 저장된 데이터를 조회할 수 있기 때문입니다.

데이터베이스를 만들고 테이블을 만드는 방법에 대해 알아봅시다.




데이터베이스 만들기

안드로이드 앱에서도 데이터베이스를 사용할 수 있습니다. SQLite라고 불리는 관계형 데이터베이스가 들어있기 때문인데요, SQLite는 오픈소스로 만들어진 파일 기반의 데이터베이스입니다.

용량이 적고 가볍게 동작하면서도 관계형 데이터베이스를 위한 SQL 실행이 가능하다보니 스마트폰 단말이 나오면서부터 광범위하게 사용되어 왔습니다.

PC에서도 사용할 수 있고, 화면에서 테이블 구조나 데이터를 확인할 수 있는 도구들도 제공되죠.

하지만 SQLite에 대해 구체적인 내용까지 알아둘 필요는 없습니다.

대부분의 관계형 데이터베이스는 SQL만으로 데이터 정의 및 조작이 가능하도록 되어 있어서 데이터베이스를 만들거나 오픈한 이후에는 SQL 사용법만 알아도 충분히 사용할 수 있기 때문입니다.

데이터베이스는 저장소이며 앱에서는 하나의 파일로 만들어집니다.

데이터베이스를 만들어 두면 그 다음부터는 만들어진 데이터베이스를 오픈하여 사용합니다.

데이터베이스를 만들거나 열고 싶다면 openOrCreateDatabase 메소드를 사용합니다.

public abstract SQLiteDatabase openOrCreateDatabase (String name, int mode,
                                                                   SQLiteDatabase.CursorFactory factory)

첫 번째 파라미터는 데이터베이스 이름이며, 이 이름을 가진 파일이 내부에서 만들어집니다.

이 메소드를 호출하면 SQLiteDatabase라는 객체가 반환되는데 이 객체를 통해 SQL을 실행할 수 있습니다.

SQL을 실행할 때는 execSQL이나 rawQuery 메소드가 사용됩니다.

 

테이블 만들기

테이블을 만들 때는 CREATE TABLE로 시작하는 SQL 문이 사용됩니다.

그리고 SQLiteDatabase 객체의 execSQL 메소드를 호출할 때 파라미터로 SQL문을 전달하면 SQL문이 실행됩니다.

private void createTable(String name) {
    println(“creating table [+ name +].);
 
    db.execSQL(“create table “ + name +(+ “ _id integer PRIMARY KEY autoincrement,+ “ name text,+ “ age integer,+ “ phone text););
    tableCreated = true;
}

_id는 내부에서 사용되는 아이디이며 되도록이면 각각의 테이블마다 만들어주는 것이 좋습니다.

이 칼럼에 들어가는 값을 직접 추가할 필요가 없도록 autoincrement로 지정합니다.

이렇게 하면 레코드가 추가될 때마다 자동으로 숫자가 입력됩니다.

칼럼은 name, age, phone 이라는 이름으로 추가되었으며 각각 text나 integer 타입으로 지정되었습니다.

SQLite 데이터베이스의 칼럼에 지정할 수 있는 대표적인 타입은 다음과 같습니다.

칼럼 타입으로 어떤 것을 지정할 수 있는지 상세하게 알고 싶다면 아래 링크를 참조하세요.

SQLite에서 지원하는 칼럼 타입

 

테이블은 한 번 만들어지면 삭제하지 않는 이상 동일한 이름으로 만들 수 없습니다.

따라서 매번 동일한 이 SQL문을 실행하게 되면 기존 테이블이 있다는 에러 메시지가 보이게 됩니다.

이전에 이미 만들어진 테이블이 없을 때만 새로운 테이블을 만들도록 하려면 IF NOT EXISTS 키워드를 붙여줍니다.

그 형식은 다음과 같습니다.

CREATE TABLE [IF NOT EXISTS] table_name(col_name column_definition, ...)
[table_option] ...

 

데이터 저장하기

테이블에 데이터를 추가할 때는 INSERT INTO 문이 사용됩니다.

INSERT INTO 뒤에는 테이블 이름이 오고 그 뒤에 소괄호가 오게 됩니다.

소괄호 안에는 칼럼들이 들어갑니다.

VALUES 뒤의 소괄호 안에는 데이터를 넣을 수 있습니다.

INSERT INTO 테이블명 
    (칼럼명1, 칼럼명2, 칼럼명3, ... 칼럼명N)  
VALUES 
    (값1, 값2, 값3, ... 값N);

데이터의 자료형이 문자열이면 작은 따옴표를 붙이고 문자열이 아닌 숫자는 작은 따옴표를 붙이지 않습니다.

예를 들어, 다음과 같은 SQL문을 만들 수 있습니다.

db.execSQL( “insert into employee(name, age, phone) values (‘John‘, 20,010-7788-1234‘“ );

SQL문을 실행할 때는 execSQL 메소드를 호출합니다.

 

데이터 조회하기

데이터를 조회할 때는 SELECT 문을 사용합니다.

SELECT 문은 다음과 같은 형식으로 만들어집니다.

SELECT [* | DISTINCT] column_name [,columnname2] 
FROM tablename1 [,tablename2]
WHERE [condition and|or condition...]
[GROUP BY column-list]
[HAVING conditions]
[ORDER BY “column-list“ [ASC | DESC] ]

조금 복잡해 보이긴 하지만 SELECT 뒤에 조회하려는 칼럼들이 오고 FROM 뒤에는 테이블 이름이 온다고 생각하면 쉽습니다.

가장 단순한 형태라고 할 수 있죠.

여러분이 저장했던 데이터를 employee 테이블로부터 조회하고 싶다면 다음과 같은 SELECT 문을 사용할 수 있습니다.

select name, age, address from employee

만약 조건을 붙이고 싶다면 WHERE 문을 넣을 수 있죠.

이렇게 만들어진 SQL문은 rawQuery 메소드를 호출하면서 전달합니다.

Cursor c1 = db.rawQuery(“select name, age, address from employee“, null);
println(“cursor count :+ c1.getCount());

조금 더 복잡한 데이터를 다루고 싶을 때는 group by, having, order by 등을 사용하는 경우가 많습니다.

group by, having과 order by 사용법에 대해서는 아래 링크를 참조하세요.

group by 사용하기

having 사용하기

order by 사용하기

 

 

커서 다루기

rawQuery 메소드를 호출했을 때 반환되는 객체는 Cursor입니다.

조회했을 때 반환되는 레코드는 한 개일 수도 있고 여러 개일 수도 있는데 이 Cursor 객체를 이용하면 조회된 레코드를 하나씩 참조하면서 데이터를 꺼내볼 수 있습니다.

Cursor 객체는 각각의 레코드를 moveToNext 메소드로 넘겨볼 수 있도록 하며 그 안에 들어있는 칼럼 데이터는 getString, getInt 와 같이 자료형에 맞는 메소드를 이용해 확인할 수 있도록 합니다.

for문이나 while문을 이용하면 Cursor에서 참조하는 모든 조회 결과를 확인해볼 수 있겠네요.

for (int i = 0; i < recordCount; i++) {
    c1.moveToNext();
    String name = c1.getString(0);
    int age = c1.getInt(1);
    String phone = c1.getString(2);
    println(“Record #“ + i +:+ name +,+ age +,+ phone);
}

커서 객체로 칼럼 데이터를 확인할 때 사용할 수 있는 메소드들로는 다음과 같은 것들이 있습니다.

public abstract String getString (int columnIndex) 
public abstract short getShort (int columnIndex) 
public abstract int getInt (int columnIndex) 
public abstract long getLong (int columnIndex) 
public abstract float getFloat (int columnIndex) 
public abstract double getDouble (int columnIndex) 
public abstract byte[] getBlob (int columnIndex) 

 


반응형

'안드로이드 개발 > 부스트코스(안드로이드 프로그래밍)' 카테고리의 다른 글

인터넷 연결상태 확인하기  (0) 2019.03.27
헬퍼 사용하기  (0) 2019.03.21
데이터베이스와 SQL  (0) 2019.03.20
이미지 다운로드  (0) 2019.03.19
JSON GSON  (0) 2019.03.19
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기