티스토리 뷰
데이터베이스를 만드는 것 이외에도 테이블 정의가 바뀌어서 스키마를 업그레이드할 필요가 있을 때는 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("레코드 추가함.");
}
}
반응형
'Mobile > Android' 카테고리의 다른 글
[Android] Content Provider 1: Content Provider (0) | 2022.04.13 |
---|---|
[Android] Database 3: 데이터 조회 (0) | 2022.04.12 |
[Android] Database 1: 모바일 데이터베이스 (0) | 2022.04.11 |
[Android] Volley lib (0) | 2022.04.10 |
[Android] HTTP로 웹 서버에 요청/응답하기 (0) | 2022.04.09 |
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
- javascript
- AsyncStorage
- Async
- 정보보안기사 #실기 #정리
- redux-thunk
- Promise
- 이탈리안 레스토랑
- 파니노구스토
- redux
- react
- react-native
- 맛집
- 인천 구월동 이탈리안 맛집
- 인천 구월동 맛집
- await
- Total
- Today
- Yesterday