1. SQLiteOpenHelper
- SQLite 데이터베이스 생성 및 버전 관리를 도와주는 클래스
- SQLiteOpenHelper 클래스를 상속 받아 SQLite를 편리하게 제어 할 수 있다.
2. SQLiteOpenHelper 상속
- SQLiteOpenHelper 는 추상클래스이기 때문에 상속 받은 후, onCreate와 onUpgrade 메서드를 반드시 구현해야 한다.
public class DatabaseHandler extends SQLiteOpenHelper {
public DatabaseHandler(@Nullable Context context) {
super(context, Util.DB_NAME, null, Util.DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
// 테이블 생성
String CREATE_CONTACT_TABLE =
"create table contact ( id integer primary key, name text, phone text )";
sqLiteDatabase.execSQL(CREATE_CONTACT_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
// 기존의 테이블을 삭제하고, 새 테이블을 다시 만든다.
String DROP_TABLE = "drop table contact";
sqLiteDatabase.execSQL(DROP_TABLE);
// sqLiteDatabase.execSQL(DROP_TABLE, new String[]{Util.DB_NAME});
onCreate(sqLiteDatabase);
}
상수를 관리하는 Util 클래스
public class Util {
// 데이터베이스 관련 상수들
public static final int DB_VERSION = 1;
public static final String DB_NAME = "contact_db";
public static final String TABLE_NAME = "contact";
// 테이블의 컬럼 관련 상수들
public static final String KEY_ID = "id";
public static final String KEY_NAME = "name";
public static final String KEY_PHONE = "phone";
}
3. 추가 메소드 정의
- 새로운 메소드를 정의하여 다양한 DB 관리 기능을 구현 할 수 있다(CRUD)
- 연락처를 추가, 조회하는 메소드 구현
// 이제부터는 우리가 앱 동작시키는데 필요한
// CRUD 관련된 SQL문이 들어간 메소드를 만들면 된다.
// 1. 연락처 추가하는 메소드
public void addContact(Contact contact){
// 1) 데이터베이스를 가져온다.
SQLiteDatabase db = this.getWritableDatabase();
// 2) 저장가능한 형식으로 만들어준다.
ContentValues values = new ContentValues();
values.put(Util.KEY_NAME, contact.name);
values.put(Util.KEY_PHONE, contact.phone);
// 3) insert 한다.
db.insert(Util.TABLE_NAME, null, values);
// 4) db 사용이 끝나면, 닫아준다.
db.close();
}
// 2. 저장된 연락처를 모두 가져오는 메소드
public ArrayList<Contact> getAllContacts(){
// 1) 데이터베이스를 가져온다.
SQLiteDatabase db = this.getReadableDatabase();
// 2) 쿼리문 만든다.
String query = "select * from contact";
// 3) 쿼리문을 실행하여, 커서로 받는다.
Cursor cursor = db.rawQuery(query, null);
// 3-1) 여러 데이터를 저장할 어레이리스트 만든다.
ArrayList<Contact> contactArrayList = new ArrayList<>();
// 4) 커서에서 데이터를 뽑아낸다.
if (cursor.moveToFirst()){
do{
int id = cursor.getInt(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
Log.i("Contact_TABLE", id+", "+name+", "+phone);
// 이 데이터를, 화면에 표시하기 위해서는
// 메모리에 전부 다 남아있어야 한다!!!
Contact contact = new Contact(id, name, phone);
contactArrayList.add(contact);
} while (cursor.moveToNext());
}
// 5) DB 닫기
db.close();
// 6) DB에서 읽어온 연락처 정보를 리턴해야 한다.
return contactArrayList;
}
4. 전체 코드
상수를 관리하는 Util 클래스
public class Util {
// 데이터베이스 관련 상수들
public static final int DB_VERSION = 1;
public static final String DB_NAME = "contact_db";
public static final String TABLE_NAME = "contact";
// 테이블의 컬럼 관련 상수들
public static final String KEY_ID = "id";
public static final String KEY_NAME = "name";
public static final String KEY_PHONE = "phone";
}
연락처 정보를 관리하는 Contact 클래스
public class Contact {
public int id;
public String name;
public String phone;
public Contact(){
}
public Contact(String name, String phone) {
this.name = name;
this.phone = phone;
}
public Contact(int id, String name, String phone) {
this.id = id;
this.name = name;
this.phone = phone;
}
}
SQLite를 조작하는DatabaseHandler 클래스
package com.reodinas2.contactapp.data;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import androidx.annotation.Nullable;
import com.reodinas2.contactapp.model.Contact;
import com.reodinas2.contactapp.util.Util;
import java.util.ArrayList;
public class DatabaseHandler extends SQLiteOpenHelper {
public DatabaseHandler(@Nullable Context context) {
super(context, Util.DB_NAME, null, Util.DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
// 테이블 생성
String CREATE_CONTACT_TABLE =
"create table contact ( id integer primary key, name text, phone text )";
sqLiteDatabase.execSQL(CREATE_CONTACT_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
// 기존의 테이블을 삭제하고, 새 테이블을 다시 만든다.
String DROP_TABLE = "drop table contact";
sqLiteDatabase.execSQL(DROP_TABLE);
// sqLiteDatabase.execSQL(DROP_TABLE, new String[]{Util.DB_NAME});
onCreate(sqLiteDatabase);
}
// 이제부터는 우리가 앱 동작시키는데 필요한
// CRUD 관련된 SQL문이 들어간 메소드를 만들면 된다.
// 1. 연락처 추가하는 메소드
public void addContact(Contact contact){
// 1) 데이터베이스를 가져온다.
SQLiteDatabase db = this.getWritableDatabase();
// 2) 저장가능한 형식으로 만들어준다.
ContentValues values = new ContentValues();
values.put(Util.KEY_NAME, contact.name);
values.put(Util.KEY_PHONE, contact.phone);
// 3) insert 한다.
db.insert(Util.TABLE_NAME, null, values);
// 4) db 사용이 끝나면, 닫아준다.
db.close();
}
// 2. 저장된 연락처를 모두 가져오는 메소드
public ArrayList<Contact> getAllContacts(){
// 1) 데이터베이스를 가져온다.
SQLiteDatabase db = this.getReadableDatabase();
// 2) 쿼리문 만든다.
String query = "select * from contact";
// 3) 쿼리문을 실행하여, 커서로 받는다.
Cursor cursor = db.rawQuery(query, null);
// 3-1) 여러 데이터를 저장할 어레이리스트 만든다.
ArrayList<Contact> contactArrayList = new ArrayList<>();
// 4) 커서에서 데이터를 뽑아낸다.
if (cursor.moveToFirst()){
do{
int id = cursor.getInt(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
Log.i("Contact_TABLE", id+", "+name+", "+phone);
// 이 데이터를, 화면에 표시하기 위해서는
// 메모리에 전부 다 남아있어야 한다!!!
Contact contact = new Contact(id, name, phone);
contactArrayList.add(contact);
} while (cursor.moveToNext());
}
// 5) DB 닫기
db.close();
// 6) DB에서 읽어온 연락처 정보를 리턴해야 한다.
return contactArrayList;
}
}
연락처 추가하는 액티비티의 xml 파일 (activity_add.xml)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AddActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="30dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:text="연락처 추가"
android:textSize="28sp" />
<EditText
android:id="@+id/editName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="50dp"
android:layout_marginRight="15dp"
android:ems="10"
android:hint="이름 입력"
android:inputType="textPersonName"
android:textSize="28sp" />
<EditText
android:id="@+id/editPhone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="30dp"
android:layout_marginRight="15dp"
android:ems="10"
android:hint="전화번호 입력"
android:inputType="textPersonName"
android:textSize="28sp" />
<Button
android:id="@+id/btnSave"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="50dp"
android:layout_marginRight="15dp"
android:text="저장"
android:textSize="28sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
연락처 추가하는 액티비티의 java 파일 (AddActivity.java)
package com.reodinas2.contactapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.reodinas2.contactapp.data.DatabaseHandler;
import com.reodinas2.contactapp.model.Contact;
public class AddActivity extends AppCompatActivity {
EditText editName;
EditText editPhone;
Button btnSave;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
editName = findViewById(R.id.editName);
editPhone = findViewById(R.id.editPhone);
btnSave = findViewById(R.id.btnSave);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String name = editName.getText().toString().trim();
String phone = editPhone.getText().toString().trim();
// 이름과 전화번호가 모두 있는지 확인
if (name.isEmpty() || phone.isEmpty()){
Toast.makeText(AddActivity.this, "필수항목입니다", Toast.LENGTH_SHORT).show();
return;
}
// 묶어서 처리할 Contact 객체를 하나 만든다.
Contact contact = new Contact(name, phone);
// DB에 저장한다.
DatabaseHandler db = new DatabaseHandler(AddActivity.this);
db.addContact(contact);
// DB에 저장된 연락처 로고 확인
db.getAllContacts();
// 유저한테 잘 저장되었다고, 알려주고
Toast.makeText(AddActivity.this, "잘 저장되었습니다", Toast.LENGTH_SHORT).show();
// 액티비티 종료
finish();
}
});
}
}
테스트 결과
'Android' 카테고리의 다른 글
Android Studio - RecyclerView와 Adapter를 이용하여 리스트를 화면에 표시하기 (1) | 2023.02.01 |
---|---|
Android Studio - 아이콘 이미지를 벡터 이미지로 만들기 (0) | 2023.02.01 |
Android Studio - 간단한 유효성 검사(이메일주소, 전화번호, 웹URL, IP주소) (0) | 2023.01.31 |
Android Studio - SharedPreferences 를 이용해 앱 내에 데이터 저장, 불러오기 (0) | 2023.01.31 |
Android Studio - 액티비티 간의 화면 전환, 데이터 전달(단방향/양방향) (0) | 2023.01.30 |