이번 글에서는 이전 글 "안드로이드 DB(데이터베이스) 생성" 이후의 내용입니다.

 

2019/04/21 - [Android] - 안드로이드 DB(데이터베이스) 생성

 

이전 글에서 데이터베이스 파일을 생성하였다면 이제 그 데이터베이스 파일에 데이터를 추가하고 삭제하는 방법을 알아보겠습니다.

 

 

/* 실행 결과 */

 

 

 

이전 글에 이어서 작성하는 것으로, 메인 자바 외에 DBHelper나 레이아웃(. xml) 파일은 이전 글에서 확인해 주세요.

 

 

/* 메인 레이아웃(activity_main.xml) */

package com.tistory.godog.dbtest;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    EditText editText, editText2;
    ListView listView, listView2;

    DBHelper dbHelper;
    SQLiteDatabase db = null;
    Cursor cursor;
    ArrayAdapter adapter, adapter2;

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

        editText = findViewById(R.id.editText);
        editText2 = findViewById(R.id.editText2);
        listView = findViewById(R.id.listView);
        listView2 = findViewById(R.id.listView2);

        dbHelper = new DBHelper(this, 4);
        db = dbHelper.getWritableDatabase();    // 읽기/쓰기 모드로 데이터베이스를 오픈


    }


    public void listUpdate(View v) {
        cursor = db.rawQuery("SELECT * FROM tableName", null);
        startManagingCursor(cursor);    //엑티비티의 생명주기와 커서의 생명주기를 같게 한다.

        adapter = new ArrayAdapter(this,
                android.R.layout.simple_list_item_1);
        adapter2 = new ArrayAdapter(this,
                android.R.layout.simple_list_item_1);

        while (cursor.moveToNext()) {
            adapter.add(cursor.getString(0));
            adapter2.add(cursor.getString(1));
        }

        /*
        cursor.moveToFirst();
        cursor.moveToPrevious();
        cursor.moveToPosition(2);
        */

        listView.setAdapter(adapter);
        listView2.setAdapter(adapter2);
    }



    public void insert(View v) {
        String name = editText.getText().toString();
        String info = editText2.getText().toString();
        db.execSQL("INSERT INTO tableName VALUES ('" + name + "', '" + info + "');");

        Toast.makeText(getApplicationContext(), "추가 성공", Toast.LENGTH_SHORT).show();

        editText.setText("");
        editText2.setText("");
    }

    public void delete(View v) {
        String name = editText.getText().toString();
        db.execSQL("DELETE FROM tableName WHERE name = '" + name + "';");
    }

}

 

이전 과 달리 insert, delete, listUpdate 함수들이 추가되었다.

 

이들은 각각 버튼 '추가' '삭제' 'UPDATE'를 클릭하였을 때 실행된다.

 

 

insert 함수와 delete 함수를 보면 정작 데이터베이스의 데이터를 추가, 삭제하기 위해서 실행하는 문은 db.execSQL 한 줄이면 된다.

 

 

 

- insert 함수 

  db.execSQL("INSERT INTO tableName VALUES ('" + name + "', '" + info + "');");

execSQL은 SQL문을 실행시켜주는 기능을 한다.

 

위 문장은 tableName 테이블의 (name, info) Values를 insert(삽입) 한다는 의미이다.

 

 여기서 tableName 테이블의 이름으로 이는 저번 테이블을 CREATE(생성) 할 때 정한 테이블의 이름이다. 그러니 테이블을 생성할 때 의미의 맞게 테이블의 이름을 준 후 사용하면 된다.

 

 

※  ""(큰 따옴표), ''(작은 따옴표)을 어찌 사용해야 할지 혼란스러운 분들을 위해 간단한 팁을 드리자면 ""(큰 따옴표)는 안드로이드(자바)에서 사용되는 것이고, ''(작은따옴표)는 SQL문에서 사용되는 것이라 생각하면 편하다.

 

 위 문을 예로 들면 ""(큰 따옴표)만을 이어보면

"INSERT INTO tableName VALUES ('name', 'info');"   같은 문이 된다.

 

이 SQL문을 실행하는 것인데, 여기서 name과 info가 ''(작은따옴표)의 감싸 져 있는데 이들이 저장될 변수명 들이기 때문이다.

 

그러면 위 코드에서 ""(큰 따옴표)로 나눈 것도 name과 info가 변수명이기 때문이라는 것을 알 수 있다. 그러니 이는 평소 변수들을 문자열로 출력할 때처럼 +로 이어준 것뿐이라는 것이다.

 

 

정 어렵다면 우선 위 "INSERT INTO tableName VALUES ('name', 'info');"처럼 SQL문을 먼저 작성해본 후 여기서 변수만을 ""로 안 감싸도록 분리해서 한 문자열로 만들도록 하면 쉬울 것이다.

 

 

 

 

- delete 함수

db.execSQL("DELETE FROM tableName WHERE name = '" + name + "';");

delete 함수도 insert 함수랑 마찬가지이다.

 

단, SQL문에서 DELETE를 사용하여 삭제해준다. 그리고 WHERE은 if문 같은 것으로

 

조건은 name ='name'; 으로 editText1에서 name을 적은 후 삭제 버튼을 클릭하면 이미 기존 테이블에 저장되어 있는 name 데이터와 같은 것이 있으면 삭제되도록 한다.

 

 

 

 

 

- listUpdate 함수

여기서는 rawQuery 메서드를 사용하는데 SELECT 명령을 사용하기 위해서는 execSQL이 아닌 rawQuery를 사용해야만 한다.

 

 

rawQuery는 리턴 값으로는 Cursor 객체를 주며 이는 행을 가리키게 된다.

 

name info
aa 123
bb 234

             ↓ getString(0)            ↓getString(1)

cursor->

 

 

cursor는 행을 가리키므로 cursor를 아래로 이동[movoToNext()]을 while문으로 돌리고

 

cursor.getString(0) 는 cursor가 가리키는 행에서 첫 번째 열(name 열) 데이터를 가져오고

마찬가지로 cursor.getString(1) 는 cursor는 두 번째 열(info 열) 데이터를 가져온다.

 

 

그리고 이를 리스트 어뎁터의 추가하여 리스트 뷰로 출력하도록 만든 것이다.

 

 

여기서는 rawQuery와 Cursor 객체를 사용하여서 데이터베이스에서 데이터들을 가져오는 방법을 이해하였다면 된다.

 

+ Recent posts