데이터베이스를 만드는 가장 간단한 방법은 Context 클래스에 정의된 openOrCreateDatabase 메소드를 사용하는 것이다. Context 클래스에는 이렇게 만든 데이터베이스를 삭제할 수 있는 메소드 deleteDatabase도 정의되어 있다.
public abstract SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory)
public abstract boolean deleteDatabase(String name)
첫 번째 파라미터는 데이터베이스의 이름이다.
이름은 데이터베이스를 구분하며 데이터베이스 파일의 이름으로도 사용된다.
두 번째 파라미터는 사용 모드이다.
여기에는 MODE_PRIVATE 상수를 넣어준다.
세 번째 파라미터는 Null이 아닌 객체를 지정할 경우 쿼리의 값으로 반환되는 데이터를 참조하는 커서를 만들어 낼 수 있는 객체가 전달된다.
openOrCreateDatabase 메소드를 호출했을 때 반환되는 SQLiteDatabase 객체는 name 변수로 지정한 데이터베이스에 접근할 수 있는 메소드를 정의하고 있다.
그래서 이 메소드로 데이터베이스를 열거나 만든 후에는 SQLiteDatabase 객체를 참조해야 한다.
SQLiteDatabase 객체에서 가장 중요한 메소드 중 하나는 execSQL이다.
execSQL 메소드는 데이터베이스를 만들고 난 다음 SQL문을 실행할 때 사용된다.
레이아웃에 데이터베이스의 이름을 입력하는 editText와 데이터베이스를 만드는 button,
테이블의 이름을 입력하는 editText와 테이블을 만드는 button,
마지막으로 진행 상태를 표시해주는 TextView를 ScrollView안에 담았다.
MainActivity.java에 다음과 같은 코드를 작성했다.
package org.techtown.database;
import androidx.appcompat.app.AppCompatActivity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
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;
}
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');
}
}
우선 데이터베이스 만들기 버튼을 누르면 정의한 createDatabase 메소드를 호출해 데이터베이스를 만들도록 하였다.
private void createDatabase(String name){
println("createDatabase 호출됨.");
database = openOrCreateDatabase(name, MODE_PRIVATE, null);
println("데이터베이스 생성함 : " + name);
}
editText에서 데이터베이스 이름을 전달받아 openOrCreateDatabase 메소드를 호출한다.
테이블 만들기 버튼을 누르면 정의한 creatTable 메소드를 호출해 테이블을 만들고 정의한 insertRecord 메소드를 호출하여 임의의 레코드를 삽입한다.
private void createTable(String name){
println("createTable 호출됨.");
if(database == null){
println("데이터베이스를 먼저 생성하세요.");
return;
}
database.execSQL("create table if not exists " + name +
"(" + " _id integer PRIMARY KEY autoincrement, " +
" name text, " +
" age integer, " +
" mobile text)");
println("테이블 생성함 : " + name);
}
createTable 메소드에선 execSQL 메소드로 SQL문을 파라미터로 전달받아 테이블을 생성한다.
여기서는 직원 테이블을 위해 직원id, 이름, 나이, 휴대폰 번호로 정의하였다.
직원 아이디는 자동으로 1씩 증가하는 키 값(PRIMARY KEY autoincrement)으로 정의하였다.
private void insertRecord(){
println("insertRecord 호출됨.");
if(database == null){
println("데이터베이스를 먼저 생성하세요.");
return;
}
if(tableName == null){
println("테이블을 먼저 생성하세요.");
return;
}
database.execSQL("insert info " + tableName +
"(name, age, mobile) " +
" values" +
"('John', 20, '010-1000-1000')");
println("레코드 추가함.");
}
insertRecord 메소드에선 execSQL 메소드로 SQL문을 파라미터로 전달받아 임의의 레코드를 만들어 추가하였다.
여기서는 'John', 20, '010-1000-1000' 을 추가하였다.