본문 바로가기
Android/Concepts

SQLite DB에 데이터 저장하기

by JuHy_ 2020. 5. 1.

Database란?

어플리케이션의 데이터를 저장할 때 서버를 통해 저장할 수도 있지만, 기기에 저장할 수도 있다.

 

안드로이드에서는 SharedPreference를 사용하여 (key,value) 형태로 데이터를 저장할 수 있는 기능을 제공한다.

하지만 단순한 형태로만 저장할 수 있기 때문에 복잡한 데이터를 저장하기에는 불편함이 따른다.

이 때, Database를 사용하면 더 체계적인 형태로 데이터를 저장할 수 있다.

 

안드로이드에서는 SQLite라는 임베디드 데이터베이스를 사용한다.

SQLite는 관계형 데이터베이스로 Table의 형태로 데이터를 저장하며 SQL문을 통해 기능을 수행한다.

따라서 관계형 데이터베이스에 대한 지식과 SQL 문법에 대한 기본적인 지식이 필요하다.

그 내용은 아래 글을 참고하자.

 

관계형 데이터베이스(Relational Database)

https://ju-hy.tistory.com/17

 

Data Model / DML, DDL

Data Model Data Model이란 데이터베이스를 관리하기 위한 여러가지 방법론으로, 가장 많이 쓰이는 모델로는 Relational Model과 E-R Model이 있다. Relational Model이란? 데이터베이스 관리를 위한 방법론으로,..

ju-hy.tistory.com

SQL 문법

https://ju-hy.tistory.com/18

 

SQL Basics - 1

Data Definition Table 생성 CREATE TABLE instructor( id CHAR(5), name VARCHAR(20) NOT NULL, dept_name VARCHAR(20), salary NUMERIC(8,2), PRIMARY KEY(id), FOREIGN KEY(dept_name) REFERENCES department)..

ju-hy.tistory.com

 

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

[부스트코스]안드로이드 프로그래밍

https://www.edwith.org/boostcourse-android