티스토리 뷰

데이터베이스를 만드는 것 이외에도 테이블 정의가 바뀌어서 스키마를 업그레이드할 필요가 있을 때는 Helper 클래스를 사용할 수 있다. 

 

public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CorsorFactory factory, int version)

SQLiteOpenHelper Class는 데이터베이스를 만들거나 열기 위해 필요한 작업들을 도와주는 역할을 한다. 

 

핵심은 integer type인 버전 정보를 다르게 지정하여 데이터베이스의 스키마나 데이터를 변경하는 것이다. 

 

SQLiteOpenHelper 객체는 데이터베이스를 만들거나 열기 위해 필요한 작업을 도와주는 역할을 하는거지 데이터베이스를 직접 생성하느거 하지는 않는다. 

 

SQLiteOpenHelper 객체가 데이터베이스를 생성하게끔 할 때는 아래 메서드를 사용한다.

public SQLiteDatabase getReadableDatabase();
public SQLiteDatabase getWritableDatabase();

또한 해당 메서드를 사용하여 데이터베이스를 호출했을 때, 아래와 같은 콜백 메서드가 같이 호출되기 때문에 아주 유용하게 사용할 수 있다.

public abstract void onCreate(SQLiteDatabase db);
public abstract void onOpen(SQLiteDatabase db);
public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);

DatabaseHelper라는 클래스를 하나 생성하고, SQLiteOpenHelper 객체를 상속시켜준다.

그리고 해당 클래스가 호출되고, 데이터베이스를 참조했을 때 호출될 콜백 메서드를 정의해주면 된다.

 

 

◎DatabaseHelper

package com.example.simpledatabase;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import androidx.annotation.Nullable;

public class DatabaseHelper extends SQLiteOpenHelper {

    public static String NAME = "employee.db";
    public static int VERSION = 1;

    public DatabaseHelper(@Nullable Context context) {
        super(context, NAME, null, VERSION);
    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        println("onOpen 호출");
    }

    @Override
    //SQLiteDatabase 객체 생성 시 콜백
    public void onCreate(SQLiteDatabase db) {
        println("onCreate 호출");

        String sql = "CREATE TABLE IF NOT EXISTS emp(" +
                " _id integer PRIMARY KEY autoincrement," +
                " name text," +
                " age integer," +
                " mobile text)";

        db.execSQL(sql);
    }

    @Override
    // 현재 데이터베이스 버전이 이미 사용하고 있는  SQLiteDatabase 파일의 버전과 다를 경우 콜백
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        println("onUpgrade 호출" + oldVersion + "->" + newVersion);

        if(newVersion > 1) {
            db.execSQL("DROP TABLE IF EXISTS emp");
        }
    }

    public void println(String data) {
        Log.d("databaseHelper", data);
    }
}

이후에는 직전 포스팅에서 사용했던 코드에 createDatabase 메서드만 살짝 수정하여, 데이터베이스를 직접 생성하는 것이 아닌, Helper 클래스의 onCreate 메서드가 생성하도록 해준다. 

 

◎MainActivity

package com.example.simpledatabase;

import android.database.sqlite.SQLiteDatabase;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    EditText editText;
    EditText editText2;
    TextView textView;

    SQLiteDatabase database;
    DatabaseHelper dbHelper;
    String tableName;

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

        editText = findViewById(R.id.editTextText1);
        editText2 = findViewById(R.id.editTextText2);
        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();
                insertRecord();
            }
        });
    }

    private void createDatabase(String name) {
        textView.append("createDatabase 호출됨.");
        /*database = openOrCreateDatabase(name, MODE_PRIVATE, null);*/
        dbHelper = new DatabaseHelper(this);
        database = dbHelper.getWritableDatabase();// SQLiteDatabase 참조
        textView.append("데이터베이스 생성함: " + name);
    }

    private void insertRecord() {
        textView.append("insertRecord 호출됨.");
        if(database == null) {
            textView.append("데이터베이스를 먼저 생성하세요");
            return;
        }

        if(tableName == null) {
            textView.append("테이블을 먼저 생성하세요.");
            return;
        }
        database.execSQL("INSERT INTO " + tableName +
                "(name, age, mobile)" +
                "VALUES " +
                "('John', 20, '010-1111-1111')"
                );
        textView.append("레코드 추가함.");
    }
}

 

Comments