코드네임 :
📱 모바일프로그래밍 - SQLite로 데이터 관리하기 📱 본문
[ SQLite ]
: 내장된 관계형 데이터베이스 관리 시스템 (RDBMS)
- 오픈소스이며 경량화됨
- ⭐️ SQLite로 생성된 모든 데이터베이스는 앱 내에서 데이터베이스 이름으로 접근이 가능하지만, 앱 외부에서는 접근 불가⭐️
[ SQLiteOpenHelper & SQLiteDatabase ] - 혼동주의
DatabaseHelper.java
package com.example.project11_sql;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
// DatabaseHelper는 SQLiteOpenHelper를 상속받아
// 데이터베이스 생성, 업그레이드, 및 CRUD(생성, 읽기, 갱신, 삭제) 작업을 처리
public class DatabaseHelper extends SQLiteOpenHelper {
static final String DATABASE_NAME = "UsersDB1.db"; // 데이터베이스 파일 이름
static final String TABLE_NAME = "UsersTable"; // 테이블 이름
static final int DATABASE_VERSION = 1; // 데이터베이스 버전
public DatabaseHelper(@Nullable Context context) {
//SQLitePoenHelper의 생성자를 호출하여 데이터베이스 초기화
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
//앱에서 데이터베이스가 처음 생성될 때 호출됨
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//SQL 쿼리를 사용해 UsersTable이라는 테이블 생성
// • id: 기본 키로, 자동 증가 설정
// • name: 최대 50자 문자열
// • age: 정수 값
String query = "CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(50), age INTEGER)";
// SQLite 데이터베이스에 SQL 명령을 실행하는 메서드
// SQL 쿼리(문자열 형태로 작성된 SQL 명령어)를 받아 데이터베이스에서 실행
sqLiteDatabase.execSQL(query);
}
@Override
// 데이터베이스 버전이 변경될때 호출됨
// 기존 테이블을 삭제 후, 새로생성(onCreate 호출)
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
String query = "DROP TABLE IF EXISTS " + TABLE_NAME;
sqLiteDatabase.execSQL(query);
onCreate(sqLiteDatabase);
}
public Cursor searchData(){
// 데이터베이스를 “읽기 전용” 상태로 열기 위한 객체를 반환
SQLiteDatabase db = this.getReadableDatabase();
String query = "SELECT * FROM "+ TABLE_NAME;
// SQL 쿼리를 실행하여 테이블의 모든 데이터를 반환
Cursor cursor = db.rawQuery(query, null);
//db.close
// 결과는 Cursor 객체로 반환
return cursor;
}
// //db.query를 사용해 데이터 검색을 수행
// public Cursor searchData2() {
// SQLiteDatabase db = this.getReadableDatabase();
// Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
// return cursor;
// }
boolean insertData(String name, String age){
// 데이터베이스에 읽기/쓰기 작업을 할 수 있는 객체를 가져옴
SQLiteDatabase db = this.getWritableDatabase();
//// SQL INSERT 명령을 사용해 데이터를 테이블에 삽입
//name과 age 값을 매개변수로 받아, 데이터베이스에 저장
String query = "INSERT INTO UsersTable (NAME, AGE) VALUES ('" + name +"'," + Integer.parseInt(age) +" )";
db.execSQL(query);
db.close();
return true;
}
public boolean updateData(String name, String age){
SQLiteDatabase db = this.getWritableDatabase();
// 문자열로 표현된 숫자(age)를 정수형 데이터로 변환
int ageInt = Integer.parseInt(age);
// SQL UPDATE 명령으로 데이터를 갱신
// 입력된 name 값과 일치하는 행의 age 값을 1 증가
String query = "UPDATE " + TABLE_NAME + " SET AGE=" + (ageInt+1) +" WHERE NAME = '" + name + "'";
db.execSQL(query);
db.close();
return true;
}
boolean deleteData(){
SQLiteDatabase db = this.getWritableDatabase();
// SQL DELETE 명령으로 테이블의 모든 데이터를 삭제
// 테이블이 초기화되므로 모든 데이터가 사라잠
String query = "DELETE FROM " + TABLE_NAME;
db.execSQL(query);
return true;
}
}
MainActivity.java
package com.example.project11_sql;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.example.project11_sql.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
// 데이터베이스 작업을 처리하는 DatabaseHelper 객체를 생성
// dbHelper는 데이터 삽입, 검색, 갱신, 삭제 작업을 수행하는 데 사용됨
DatabaseHelper dbHelper = new DatabaseHelper(this);
binding.btnInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 사용자가 입력한 이름과 나이를 editTextName과 editTextAge에서 가져옴
String name = binding.editTextName.getText().toString();
String age = binding.exitTextAge.getText().toString();
// 이름(name)과 나이(age)가 비어 있지 않은지
if (!name.isEmpty() && !age.isEmpty()) {
// dbHelper.insertData(name, age)를 호출하여 데이터베이스에 삽입
boolean newInsert = dbHelper.insertData(name, age);
//성공 여부는 newInsert로 반환되며, 성공 시 Toast로 성공 메시지를 표시
if (newInsert)
Toast.makeText(getApplicationContext(), "데이터 삽입을 성공했습니다", Toast.LENGTH_SHORT).show();
else
Toast.makeText(getApplicationContext(), "데이터 삽입을 실패했습니다", Toast.LENGTH_SHORT).show();
} else //입력값이 비어 있으면 경고 메시지를 표시
Toast.makeText(getApplicationContext(), "Please Fill All Data's'", Toast.LENGTH_SHORT).show();
}
});
binding.btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//dbHelper.searchData()를 호출하여 데이터베이스에서 모든 데이터를 검색
// 결과는 Cursor 객체로 반환됨
Cursor cursor = dbHelper.searchData();
//검색 결과가 없으면 getCount()를 통해 확인하고, 없을 경우 경고 메시지를 표시
if(cursor.getCount() ==0){
Toast.makeText(getApplicationContext(), "데이터를 찾을 수 없습니다", Toast.LENGTH_SHORT).show();
}
//StringBuffer buf = new StringBuffer();
//textView에 표시된 텍스트를 초기화
//즉, 버튼이 클릭될 때 textView의 내용을 빈 문자열로 설정하여 기존 텍스트를 모두 erase
binding.textView.setText("");
// Cursor 객체는 검색된 데이터베이스의 결과를 행(row) 단위로 읽
// moveToNext() 메서드는 다음 행으로 이동하며, 이동 성공 시 true를 반환
// 행이 없으면 false를 반환하여 반복문이 종료됨
while(cursor.moveToNext()){
int id = cursor.getInt(0); //현재 행에서 **첫 번째 열(column)의 값을 정수(int)**로 가져옴
// 예를 들어, SQL 쿼리가 SELECT id, name, age FROM UsersTable이라면, i
// d가 첫 번째 열이고 이 값을 읽어오는 코드
String name = cursor.getString(1);
int age = cursor.getInt(2);
// 예: 기존 텍스트가 “데이터: “라면, append()로 추가된 텍스트는 “데이터: 새 텍스트”가 됩
binding.textView.append("\n"+"id : " +id+", name: "+name+", age: "+age);
}
}
});
binding.btnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//사용자 입력 가져오기
String name = binding.editTextName.getText().toString();
String age = binding.exitTextAge.getText().toString();
// dbHelper.updateData(name, age)를 호출하여 데이터베이스에서 이름에 해당하는 행의 나이를 갱신
boolean isUpdate = dbHelper.updateData(name, age);
//갱신 성공 여부는 isUpdate로 반환되며, 성공 시 Toast로 성공 메시지를 표시
if (isUpdate)
Toast.makeText(getApplicationContext(), "데이터 갱신을 성공했습니다", Toast.LENGTH_LONG).show();
else
Toast.makeText(getApplicationContext(), "데이터 갱신을 실패했습니다", Toast.LENGTH_LONG).show();
}
});
binding.btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//dbHelper.deleteData()를 호출하여 데이터베이스 테이블의 모든 데이터를 삭제
boolean isDelete = dbHelper.deleteData();
//삭제 성공 여부에 따라 성공 또는 실패 메시지를 Toast로 표시
if (isDelete)
Toast.makeText(getApplicationContext(), "데이터 삭제을 성공했습니다", Toast.LENGTH_LONG).show();
else
Toast.makeText(getApplicationContext(), "데이터 삭제을 실패했습니다", Toast.LENGTH_LONG).show();
}
});
}
}
'백엔드 > Android_JAVA' 카테고리의 다른 글
📱 프래그먼트에서 바인딩 사용하기 📱 (0) | 2024.12.12 |
---|---|
📱 모바일프로그래밍 - 데이터 저장소 & 공유환경설정 파일로 데이터 관리하기 📱 (0) | 2024.12.08 |
📱 모바일프로그래밍 - 콘텐트프로바이더 📱 (0) | 2024.12.08 |
📱 모바일프로그래밍 - 브로드캐스트 리시버 📱 (0) | 2024.12.07 |
📱 모바일프로그래밍 - 서비스 📱 (3) | 2024.12.07 |