코드네임 :

📱 모바일프로그래밍 - SQLite로 데이터 관리하기 📱 본문

백엔드/Android_JAVA

📱 모바일프로그래밍 - SQLite로 데이터 관리하기 📱

비엔 Vien 2024. 12. 12. 19:32

[ 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();

            }
        });
    }
}