[SQLite] 데이터 수정 - UPDATE 문

Hoon·2022년 3월 10일
0
post-custom-banner

사용 목적

  • 단순히 테이블에 서로 다른 데이터를 추가하는 것이 아니라, 기존의 데이터를 변경해야 하는 경우

예시

이번에 "Fairy : Face Diary" 앱 제작 프로젝트에서 사용자 정보 페이지를 만들면서 이름과 나이 column의 기존 데이터를 사용자가 새로 입력한 데이터로 변경하는 상황이 있었다. 예전에는 이런 상황에서 그냥 DB에 있는 데이터를 DELETE 문으로 지우고 새로운 데이터를 INSERT 문으로 채우는 방식을 사용했었다. 이번에는 이렇게 두 번 쿼리를 수행하지 않고, UPDATE 문으로 해결해보고 싶어서 방법을 찾아보게 되었다.


사용 방법

MySQL - Upsert

  • MySQL에서는 DUPLICATE 라는 문법을 사용해서 아래와 같이 쿼리문을 작성한다. Upsert라고 불리는 이 방법을 사용하면 키 값이 존재하지 않을 경우에는 INSERT 문으로 동작하고, 중복된 키 값이 존재할 경우에는 UPDATE 문으로 동작한다! 하지만, 이게 SQLite에서는 지원되지 않는다.

예시

INSERT INTO 테이블명(KEY, COLUMN1, COLUMN2) VALUES(1, "지훈", 27)
ON DUPLICATE KEY UPDATE USERNAME = '충훈', USERAGE=30
  • 위의 쿼리문을 두 번 실행하면 각각 다음과 같은 결과가 나온다.

    🔻 SQLite에서는 요 아래 방법으로 INSERT, UPDATE를 따로 해야 한다!

SQLite - UPDATE 문

UPDATE 테이블명 SET 컬럼명1=1, 컬럼명2=2 WHERE 조건식

예시

테이블 생성

  • 쿼리문
CREATE TABLE USERDATA_T (ID INTEGER, USERNAME TEXT, USERAGE INTEGER)
  • 쿼리문 String 상수로 선언, 할당
    Contract class 등에 쿼리문들을 따로 보관하는 방법도 있지만, 편의상 여기서는 DBHelper class 안에 들어있다고 생각하자. 쿼리문을 코드로 작성할 때는 띄어쓰기, 콤마, 따옴표 등을 주의해야 한다..!! (이것때문에 아주 고생했던 기억이...🤮)
private static final String TBL_USERDATA = "USERDATA_T";
private static final String COL_ID = "ID";
private static final String COL_USERNAME = "USERNAME";
private static final String COL_USERAGE = "USERAGE";

// CREATE TABLE USERDATA_T (ID INTEGER, USERNAME TEXT, USERAGE INTEGER)
private static final String SQL_CREATE_USERDATA_T = 
	"CREATE TABLE IF NOT EXISTS " + TBL_USERDATA  + " " +
    "(" +
	COL_ID +        " INTEGER PRIMARY KEY" + ", " +
	COL_USERNAME +  " TEXT"                              + ", " +
	COL_USERAGE +   " INTEGER"                               + ")";
  • 쿼리 실행
public class DBHelper extends SQLiteOpenHelper {
	// 중략
    @Override
    public void onCreate(SQLiteDatabase db) {
    	db.execSQL(SQL_CREATE_USERDATA_T);
	}
}

데이터 추가 : INSERT

  • 쿼리문
INSERT INTO USERDATA_T VALUES (1, '지훈', 27)
// INSERT INTO USERDATA_T VALUES 
private static final String SQL_INSERT_USERDATA_T = 
	"INSERT INTO " + TBL_USERDATA  + " VALUES ";
  • 쿼리 실행
    데이터를 추가하는 method를 만들고, 앱의 다른 class / activity 등 어디선가 호출한다고 생각하자.
DBHelper dbHelper;

public void insertToDB (int id, String userName, int userAge) {
	dbHelper = new DBHelper();
    SQLiteDatabase db = dbHelper.getWritableDatabase() ;
    String query = SQL_INSERT_USERDATA_T + "(" + id + ", '" + userName + "', " + userAge + ")";
    db.execSQL(query);
}

// 중략 - 코드 어디선가 호출
insertTODB(1, "지훈", 27);
  • 결과

데이터 변경 : UPDATE

  • 쿼리문
UPDATE USERDATA_T SET USERNAME='충훈', USERAGE=30 WHERE ID=1
// UPDATE USERDATA_T SET 
private static final String SQL_UPDATE_USERDATA_T = 
	"UPDATE " + TBL_USERDATA  + " SET ";
  • 쿼리 실행
    데이터를 변경하는 method를 만들고, 어디선가 호출한다고 생각하자.
public void updateToDB (int id, String userName, int userAge) {
	dbHelper = new DBHelper();
    SQLiteDatabase db = dbHelper.getWritableDatabase() ;
    String query = SQL_UPDATE_USERDATA_T + 
    	COL_USERNAME + "='" + userName + "', " + 
    	COL_USERAGE + "=" + userAge + " " + 
        "WHERE " + COL_ID + "=" + id;
    db.execSQL(query);
}

// 중략 - 코드 어디선가 호출
updateToDB(1, "충훈", 30);
  • 결과
profile
가치를 만드는 사람이 되고 싶습니다
post-custom-banner

0개의 댓글