Home Data base 만들기
Post
Cancel

Data base 만들기

모바일 데이터 베이스란?

앱을 만들면서 데이터를 간단하게 저장하고 싶을 때는 SharedPreferences를 사용할 수 있다.

안드로이드에서 기본적으로 제공되는 SharedPreferences는 데이터의 양이 많거나
중요한 데이터라면 서버나 DB, 파일의 형태로 저장을 하면 되지만,
간단한 설정 값이나 문자열 같은 데이터들은 DB에 저장하기에는 부담스러울 경우 사용된다.

하지만 많은 양의 데이터를 체계적으로 관리하려면 데이터베이스를 사용해야 한다.

특히, SQL 문으로 데이터를 조회하는 관계형 데이터베이스를 휴대 단말에서 사용할 수 있다면

적은 양의 데이터라도 접근이 가능하기 때문에 더 효율적이다.

안드로이드는 임베디드 데이터베이스(Embedded Database)로 개발된 경량급(Light-weight)

관계형 데이터베이스인 SQLite를 가지고 있다.

SQLite 데이터베이스는 파일로 만들어진 하위 수준의 구조를 가지면서도,

데이터베이스의 기능까지 그대로 사용할 수 있도록 만든 것이다.

또한 저장될 때는 파일로 저장되므로 데이터베이스의 복사, 이동, 삭제가 매우 쉽다.

SQLite 데이터베이스의 가장 큰 특징은 데이터 조회 속도가 빠르다는 것과 표준 SQL을 지원 한다는 점이다.

즉, 기존에 웹이나 PC에서 사용하던 업무용 앱의 데이터 관리 기능을 그대로 사용할 수 있다는 것이다.

앱의 생산성이 높아지고 향후 기능을 변경할 때도 간단한 SQL 수정만으로 데이터 처리 방식을 바꿀 수 있다.

아래는 일반적인 데이터베이스 활용 순서이다.

Untitled Diagram drawio


데이터 베이스와 테이블 만들기

데이터베이스는 여러 개의 테이블을 담는 그릇이라고 볼 수 있다.

따라서 데이터베이스를 사용하려면 우선 그릇을 만들거나 이미 만들어 놓은 그릇을 열고 닫을 수 있어야 한다.

데이터 베이스를 만드는 가장 간단한 방법은 Context 클래스에 정의된 openOrCreateDatabase 메서드를 사용하는 것이다.

즉, 앱에서 기본적으로 사용하는 Activity 클래스가 Context를 상속한 것이므로 결국 액티비티를 만들 때

그 안에서 openOrCreateDatabase 메서드로 데이터를 만들거나 열 수 있다.

또한 삭제하는 메서드인 deleteDatabase도 있다.

API

1
2
3
public abstract SQLiteDatabase openOrCreateDatabase (String name, int mode, 
																	SQLiteDatabase.CursorFactory facroy)
public abstract boolean deleteDatabase(String name)

openOrCreateDatabase 첫 번째 매개변수는 데이터베이스 이름, 두 번째는 사용모드, 세 번째는 NULL이 아닌 객체를 지정할 경우 쿼리의 결과 값으로 반환되는 데이터를 참조하는 커서를 만들어 낼 수 있는 객체가 전달된다. 반환 값은 우리가 지정한 데이터베이스를 접근할 수 있는 데이터 베이스 객체가 반환 되므로 SQLiteDatabase 객체를 참조해야 한다.

SQLiteDatabase 객체에서 가장 중요한 메서드 중 하나는 execSQL이다. 이 메서드는 데이터 베이스를 만들고 난 다음 SQL문을 실행할 때 사용된다. 따라서, 이 메서드를 사용하면 테이블을 만드는 것 뿐만 아니라 레코드 추가처럼 표준 SQL을 사용하는것처럼 데이터 처리가 가능하다.

API

1
public void execSQL(String sql) throws SQLException

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
public class MainActivity extends AppCompatActivity {
    EditText editText;
    EditText editText2;
    TextView textView;

    SQLiteDatabase database;

    String tableName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = findViewById(R.id.editText);
        editText2 = findViewById(R.id.editText2);
        textView = findViewById(R.id.textView);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                String databaseName = editText.getText().toString();
                createDatabase(databaseName);
            }
        });

        Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                tableName = editText2.getText().toString();
                createTable(tableName);
                insertRecord();
            }
        });
    }

    private void createDatabase(String name){
        println("createDatabase 호출됨.");
        // 데이터 베이스 생성
        database = openOrCreateDatabase(name,MODE_PRIVATE, null);
        println("데이터베이스 생성함: " + name);

    }

    private void createTable(String name){
        println("createTable 호출됨.");

        if(database == null){
            println("데이터베이스를 먼저 생성하세요.");
            return;
        }

        // 테이블을 만들기 위한 SQL문 실행하기
        database.execSQL("create table if not exists " + name + "("
                + " _id integer PRIMARY KEY autoincrement, "
                + " name text, "
                + " age integer, "
                + " mobile text)");




        println("테이블을 생성함: " + name);
    }

    private void insertRecord(){

        println("insertRecord 호출됨.");

        if(database == null){
            println("데이터베이스를 먼저 생성하세요.");
            return;
        }

        if(tableName == null){
            println("테이블을 먼저 생성하세요.");
            return;
        }

        database.execSQL("insert into " + tableName
        + "(name, age, mobile) "
        + " values "
        + "( ' John ', 20, ' 010-1000-1000 ' )");

        println("레코드 추가됨");
    }

    public void println(String data){
        textView.append(data + "\n");
    }
}

execSQL 메서드는 SQL문을 매개변수로 전달 받기 때문에 원하는 기능의 SQL을 먼저 정의해야 한다.

위에서는 직원 id, 이름, 나이 휴대폰 번호로 정의 하였다.

id 같은 경우 안드로이드에서 앞에 ‘_‘를 붙여 ‘_id’로 만드는 방법을 권장하므로 위와 같은 이름을 사용하였다.

또한, 자동으로 1씩 증가하는 값(PRIMARY KEY autoincrement)으로 정의하였다.

insertRecord 메서드에서 execSQL 메서드로 임의의 데이터 JON, 20 ,010-1000-1000을 삽입한다.

SQLite는 각각의 레코드별로 입력되는 데이터 타입을 다르게 넣을 수 있다.

아래는 column에 참조용으로 정의할 수 있는 데이터 타입이다.

column type설명
text, varchar문자열
smallint, integer정수 (2byte or 4byte)
real, float, double부동소수 (4byte or 8byte
booleantrue or false
data, time, timestamp시간 (날짜, 시간, 날짜 + 시간)
blob,binary바이너리

결과

Untitled Diagram drawio


SQLite는 GUI 기반으로 만들어진 데이터베이스 관리 도구가 있는데, SQLite 의 경우 DB Browser for SQLite

관리 도구를 사용할 수 있다.

사이트 바로가기

This post is licensed under CC BY 4.0 by the author.