[Android Studio] SQLite (1)

노유성·2023년 4월 29일
0
post-thumbnail

🌞SQLite의 사용 이유

우리가 DB를 사용하는데에 있어서 DB가 네트워크 상에 있어야 하는 경우가 있고 로컬에 있어야하는 경우가 있다.

데이터가 유출되어도 괜찮은 정보는 로컬에서 관리하는 편에 서버 측에서도 또 사용자에게 있어서도 편하다.(네트워크가 없어도 DB를 사용할 수 있으므로)

🌞사용 준비

🪐Table 스키마 만들기

우리가 사용할 DB에 여러 가지 테이블들이 있을 것이고 테이블 별로 개념 스키마가 있다.
해당 스키마의 정보는 테이블을 생성, 유지 보수, 이용 함에 있어서 꾸준히 사용되므로 사용되는 테이블 및 COLUMN명은 미리 정의해놓고 사용하는 것이 읽기 쉬운 코드를 작성하는데에 있어서 유리하다.


import android.provider.BaseColumns;

public final class ExerciseType {
    private ExerciseType(){}

    public static class ExerciseTypeEntry implements BaseColumns {
        public static final String TABLE_NAME = "ExerciseType";
        public static final String COLUMN_CATEGORY = "category";
        public static final String COLUMN_EXERCISE_TYPE = "exercise_type";
        public static final String COLUMN_EXERCISE = "exercise";
    }

}

위 코드는 운동정보를 저장할 table의 스키마에서 사용되는 상수들을 정의한 코드이다.
혹시나 잘못해서 class의 instance를 생성할 수 있으므로 생성자를 private으로 선언한다.

위 코드는 nested class로 쓰여있는데, 이유는 내부 class가 BaseColumns 인터페이스를 오버라이딩해서 사용하기 위해서이다. BaseColumns에서는 _ID등 SQLite를 이용하는데 있어서 용이한 상수들이 정의되어 있다.

내부 class안에 DB를 이용하는데에 필요한 상수들을 정의해서 사용한다.

🌈entry

"Entry"는 SQLiteOpenHelper 클래스에서 데이터베이스의 스키마를 나타내는 내부 클래스의 이름으로 많이 사용됩니다. BaseColumns 인터페이스를 구현하여 "_ID"라는 특별한 열을 갖게 됩니다. - chatGPT

🪐DBHelper

우리가 db를 처음 사용하면 table을 처음 생성할 수도, table의 스키마가 변경이 될 수도, db를 업그레이드 할 수도 있다. 해당 상황들을 다루는 함수들은 activity에 정의해놓는 것보다는 따로 class를 만들어놓는 것이 편하다. 해당 사유로 DBHelper라는 class를 구현해서 사용한다.

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class ExerciseTypeDbHelper extends SQLiteOpenHelper {

    private static final String SQL_CREATE_ENTRIES =
            "CREATE TABLE " + ExerciseType.ExerciseTypeEntry.TABLE_NAME + " (" +
                    ExerciseType.ExerciseTypeEntry._ID + " INTEGER PRIMARY KEY," +
                    ExerciseType.ExerciseTypeEntry.COLUMN_CATEGORY  + " TEXT," +
                    ExerciseType.ExerciseTypeEntry.COLUMN_EXERCISE_TYPE + " TEXT," +
                    ExerciseType.ExerciseTypeEntry.COLUMN_EXERCISE + " TEXT UNIQUE)";
                    
    public static final String DATABASE_NAME = "UcanHealth.db";
    public static final int DATABASE_VERSION = 1;
    private static final String SQL_DELETE_ENTRIES =
            "DROP TABLE IF EXISTS " + ExerciseType.ExerciseTypeEntry.TABLE_NAME;

    public ExerciseTypeDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_ENTRIES);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(SQL_DELETE_ENTRIES);
        onCreate(db);
    }
    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }
}

DBHelper class는 SQLiteOpenHelper clas를 오버라이딩에서 사용한다. DB를 이용할 때 만약 table이 생성되어 있지 않다면 table을 생성하는 onCreate() method가 있고 해당 메소드에서 사용할 entry를 정의한다.

생성자는 SQLiteOpenHelper에서 정의된 생성자를 이용한다. DB이름, DB version을 activity에서 받아서 사용할 수 있지만 대부분은 context를 받고 DB이름, version은 DBHelper class에 final로 정의해서 사용한다.

🌈onUprate(), onDowngrade()

onUpgrade() 메서드와 onDowngrade() 메서드는 SQLite 데이터베이스 버전이 변경될 때 호출되는 메서드입니다.
onUpgrade() 메서드는 데이터베이스 버전이 증가되었을 때 호출됩니다. 예를 들어, 이전 데이터베이스 버전에서 사용하는 테이블 구조와 새로운 데이터베이스 버전에서 사용하는 테이블 구조가 다르다면, 이전 버전의 테이블을 삭제하고 새로운 버전의 테이블을 생성하는 등의 작업을 수행할 수 있습니다.
onDowngrade() 메서드는 데이터베이스 버전이 감소될 때 호출됩니다. 예를 들어, 새로운 데이터베이스 버전에서 사용하는 테이블 구조가 이전 버전과 호환되지 않는 경우, 이전 버전으로 다운그레이드할 때 사용할 수 있습니다.
이 메서드들은 SQLiteOpenHelper 클래스를 상속한 클래스에서 오버라이드하여 구현합니다. -chatGPT

⭐사용하기

🪐SQLiteOpenHelper의 서브클래스를 인스턴스화

Activity에서 DB와 통신하기 위해서는 우리가 서브클래스로 정의한 SQLiteHelper를 인스턴스화 해서 사용한다. DB와 통신은 2가지 방식을 이용하는데 하나는 읽기 모드, 하나는 쓰기 모드이다. Helper의 다른 기능 중 하나가 읽기 모드, 쓰기 모드중 하나를 선택하는 것이다.


 private ExerciseTypeDbHelper dbHelper;
 
 private SQLiteDatabase db_write;
 
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        dbHelper = new ExerciseTypeDbHelper(getContext());
        db_write = dbHelper.getWritableDatabase();
}

해당 예제에서는 DB 읽기 모드인 instance를 만들었다.

🪐DB에 정보 삽입

// Gets the data repository in write mode
SQLiteDatabase db = dbHelper.getWritableDatabase();

// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedEntry.COLUMN_NAME_SUBTITLE, subtitle);

// Insert the new row, returning the primary key value of the new row
long newRowId = db.insert(FeedEntry.TABLE_NAME, null, values);

안드로이드 스튜디오 공식 사이트에서 제공하는 정보 삽입 예시 코드이다.
db.insert()를 호출하면 리턴값으로 삽입된 column의 id값이 반환되는데 실패하면 -1이 반환된다고 한다.

🌌정리하며

DB를 사용하는 데에 있어서 중요한 점은
1. Table 스키마 정의하기
2. DBHelper 잘 만들어놓기
3. Query문 잘 만들기
이다~

profile
풀스택개발자가되고싶습니다:)

0개의 댓글