프로그래밍(programming)/안드로이드(android)

[210509] 안드로이드 데이터베이스와 테이블의 생성과 데이터의 삽입과 조회

하빌리즘 2021. 5. 9. 23:57
반응형

(210522 수정)

 

데이터베이스는 앱의 데이터를 저장할 수 있다.

그렇기에 우리가 앱을 더 편리하고 원활하게 사용할 수 있는데,

그만큼 복잡할 수 있고, 사용자들의 중요한 데이터들을 관리하기에 유지보수가

상당히 중요하다고 생각한다.

 

이번 시간은 간단하게 데이터베이스의 생성과 

데이터베이스 내에 있는 테이블의 생성을 알아볼 것이고,

그 안에 사용자의 데이터를 담아서 삽입하고

삽입한 데이터를 조회해보는 기능을 구현해볼 것이다.

 

먼저, 가장 중요한 데이터베이스부터 만들어보자.

데이터베이스를 생성하는 메소드는 openOrCreateDatabase() 인데

생성할 데이터베이스가 이미 있다면 생성이 아니라 오픈이 된다.

 

openOrCreateDatabase API

public abstract SQLiteDatabse openOrCreateDatabase(String name, int mode, 

SQLiteDatabase.CursorFactory factory)

 

파라미터가 3개인데

첫 번째는 데이터베이스들을 구분하는 데이터베이스 이름이고,

두 번째는 접근 범위를 나타내는 사용 모드로써

이번 시간에는 이 앱에서만 접근할 수 있는 

'MODE_PRIVATE' 를 사용할 것이다.

마지막은 null이 아닌 객체를 지정할 경우,

쿼리의 결과 값으로 반환되는 데이터를 참조하는 'Cursor'를 만들 수 있는 객체가 전달된다.

 

그리고 SQLiteDatabase 객체에서 가장 중요한 메소드 중의 하나는 execSQL() 이다.

데이터베이스를 만들고 SQL문을 실행할 때 사용된다.

 

SQL문은 낯설 수도 있는데, 안드로이드에서 사용하는 SQLiteDatabase에서는

사용하는 것들이 한정적이니 큰 걱정은 안 해도 될 것 같다.

 

이제, 데이터베이스부터 만들어보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MainActivity extends AppCompatActivity {

EditText dbEdt; // 데이터베이스 생성 버튼
SQLiteDatabase database; // 데이터베이스 변수

EditText tbEdt; // 테이블 생성 버튼
TextView tv; // 문자열 출력 텍스트뷰
String tbName; // 테이블 이름

Button selectBtn; // 데이터 조회하기 버튼

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        dbEdt = (EditText)findViewById(R.id.dbEdt); // 데이터베이스 생성하기 버튼
        Button dbBtn = (Button)findViewById(R.id.dbBtn);
        dbBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String dbName = dbEdt.getText().toString(); // EditText에 입력한 값이 문자열 형태로 dbName 변수에 할당됨
                createDatabase(dbName);
            }
        });
cs
1
2
3
4
5
6
7
private void createDatabase(String name) { // 데이터베이스 생성하기 메소드
        println("createDatabase 호출됨.");
 
        database = openOrCreateDatabase(name, MODE_PRIVATE, null);
        println("데이터베이스를 생성함 : " + name);
    }
 
cs

여기서 잠깐!

println() 메소드는 메소드 호출 결과를 텍스트뷰에 출력한다.

( tv = (TextView)findByViewId(R.id.tv); )

데이터베이스 생성일 때 뿐만 아니라

앞으로도 자주 쓰일 호출 결과 문자열 출력 메소드이다.

1
2
3
public void println(String data) {
        tv.append(data + "\n"); // 텍스트뷰에 데이터들을 출력, setText가 아니고 append인 이유는 추가해서 출력하기 위함
    }
cs

이렇게 데이터베이스를 만들었으면

테이블을 만들어보자.

 

1
2
3
4
5
6
7
8
9
10
-----(onCreate() 내부)-------

tbEdt = (EditText)findViewById(R.id.tbEdt); // 테이블 생성하기 버튼
        Button tbBtn = (Button)findViewById(R.id.tbBtn);
        tbBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tbName = tbEdt.getText().toString(); // EditText에 입력한 값이 문자열 형태로 tbName 변수에 할당됨 -> insertRecord()에 사용할 것이므로 전역변수로 할당함
                createTable(tbName);
                insertRecord();
            }
        });
cs

테이블 생성 버튼을 누르면 테이블 생성과 함께

샘플 데이터도 삽입이 된다.

 

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
private void createTable(String name) { // 테이블 생성하기 메소드
        println("createTable 호출됨.");
 
        if(database == null) { // 데이터베이스가 널 이면
            println("데이터베이스부터 먼저 생성하세요. ");
            return;
        }
 
        String sql = "create table if not exists " + name + "("
                + " _id integer PRIMARY KEY autoincrement, "
                + " name text, "
                + " age integer, "
                + " sex text, "
                + " email text)";
 
        database.execSQL(sql); // 데이터베이스로 sql문을 실행해서 테이블 생성
        println("테이블을 생성함 : " + name);
    }
 
    private void insertRecord() { // 데이터 삽입 메소드
 
        println("insertRecord 호출됨. ");
        if(database == null) { // 데이터베이스가 널 이면
            println("데이터베이스부터 먼저 생성하세요. ");
            return;
        }
 
        if(tbName == null) { // 테이블 이름이 담긴 변수가 널 이면
            println("테이블부터 먼저 생성하세요. ");
            return;
        }
 
        database.execSQL("insert into " + tbName // 데이터베이스로 sql문을 실행해서 레코드를 삽입
        + " (name, age, sex, email)"
        + " values "
        + "('habilism', 25, 'Male', 'test@test.com')");
 
        println("레코드를 추가함. ");
    }
cs

데이터를 넣었으면 조회를 해서 사용자가 확인할 수 있도록 해야하기 때문에

조회하는 메소드도 만들어 보겠다.

 

1
2
3
4
5
6
7
--------(onCreate() 내부)-------------

selectBtn = (Button)findViewById(R.id.selectBtn); // 조회하기 버튼
        selectBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dataSelect();
            }
        });
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void dataSelect() { // 삽입한 레코드를 조회하는 메소드
        println("dataSelect 호출됨. ");
 
        // Cursor 객체는 결과 테이블에 들어있는 각각의 레코드를 순서대로 접근할 수 있음
        Cursor cursor = database.rawQuery("select _id, name, age, sex, email from test"null); // SQL 실행하고 Cursor 객체 받기
        int recordCount = cursor.getCount(); // Cursor 객체로 레코드의 개수를 세서 recordCount 변수에 할당
        println("레코드 갯수 : " + recordCount);
 
        for(int i = 0; i < recordCount; i++) { // 레코드 갯수만큼 i를 반복
            cursor.moveToNext(); // 다음 결과 레코드로 넘어가기
 
            // 레코드들을 가져옴
            int id = cursor.getInt(0);
            String name = cursor.getString(1);
            int age = cursor.getInt(2);
            String sex = cursor.getString(3);
            String email = cursor.getString(4);
 
            println("조회한 레코드#" + i + " : " + id + ", " + name + ", " + age + ", " + sex + ", " + email);
        }
        cursor.close();
    }
cs

초기화면

여기서 또 잠깐! 입력창을 누르게 되면 키보드가 올라가면서 입력창이 키보드에 가려지게된다.

이것을 방지하기위한 코드를 매니페스트 파일에 추가해주자.

 

1
2
3
4
5
6
7
8
9
<activity android:name=".MainActivity"
            android:windowSoftInputMode="adjustPan">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
cs

이제 키보드가 나타나면 입력창이 위로 올라간다.
생성/삽입 후 조회 결과 

 

조회량이 많아지면 스크롤뷰에 의해서 스크롤이 된다.

피드백은 언제나 환영입니다.

반응형