[Android] SQLite 쿼리 관리하기 Tips

Study/Android Studio 2021. 2. 28. 00:52 Posted by meanoflife
반응형

SQLite 쿼리 관리하기 Tips

 

Android Studio를 이용하여 공부를 하고 있습니다.

내장되어 있는 DB인 SQLite를 이용하여 데이터를 처리하고 있는데, 너무 불편합니다.

 

지.알.못 이지만, 현재 사용하고 있는 Tips을 공유해 봅니다.

 

1. Query Syntax 관리

 

쿼리를 수행하기 위해 기본적으로 다음의 메소드를 이용합니다.

  - public android.database.Cursor rawQuery( String sql, String[] selectionArgs )

  - public void execSQL( String sql )

 

인자로 쿼리query를 문자열string형태로 전달합니다.

쿼리를 만들기 위해 문자열로 조립해서 처리하는데, 복잡한 쿼리는 만드는 것이 쉽지 않습니다.

일반적으로 DBMS Tools을 이용하여 쿼리를 생성 및 테스트 하고 사용하는데,

문자열로 변환하려면 줄바꿈 및 기타 등등 (해보신분은 아시겠지만) 너머너무 귀찮습니다.

 

해서... MyBitis처럼 쿼리문장을 그대로 사용하고 싶어 다음과 같이 해 보았습니다.

 

res-values-query.xml 생성

1
2
3
4
5
6
7
8
9
10
11
<string name="TEST">
  SELECT A.ID
       , A.NAME
       , A.AGE
       , A.TEL
       , A.ADDRESS
 
    FROM TB_CUSTOM A
 
   WHERE A.ID = \':ID\'
</string>
cs

 

  - 일반적으로 사용하는 쿼리문처럼 리소스에 string으로 등록하였습니다.

     사용하실 때는, getString( R.string.TEST ); 로 가져올 수 있습니다.

 

  - 쿼리문중 마지막의 \':ID\' 부분은 바로 다음에서 설명하겠습니다.

 

 

2. Query Parameter 관리

 

기본적으로 파라미터는 "?"형태로 처리됩니다.

위의 예시의 쿼리에서 WHERE절 부분의 파라미터 부분입니다.

  - 기본형 : WHERE A.ID = ?

  - 쿼리 호출시 db.rawQuery( getString( R.string.TEST ), new String[] { "ID001" } ); 형태로 처리합니다.

 

이를 위의 예시와 같이 변경하였습니다.

  - 변형 : WHERE A.ID = \':ID\'

  - 쿼리 호출시 String.replace()를 이용하여 치환해서 처리합니다.

 

오라클DB의 경우, 파라미터로 처리하지 않으면 파라미터 값에 따라 별도의 쿼리로 인지하여 메모리에 올리지 않아 속도가 느려지지만, 음... SQLite는... 잘 모르겠습니다. OTL...

저의 경우, 성능에 지장을 줄만한 쿼리가 아니어서, 그냥 치환해서 사용하였습니다.

 

이부분은 다음의 소스를...

 

1) 사용할 파라미터를 key-value형태인 HashMap으로 생성

1
2
3
4
        HashMap<StringString> mapParam = new HashMap<StringString>();
        mapParam.put( ":ID"  , "ID001" );
        mapParam.put( ":NAME""홍길동" );
        mapParam.put( ":AGE" , "2"      );
cs

 

2) HashMap의 정보를 이용하여 replace

    수행할 parmeter가 여러개일 때를 상정하여 추가해 보았습니다.

1
String strQuery = ul.mapSqlParam( getString( R.string.SEL_CHAR_ITEM_LIST ), mapParam );
cs

 

replace를 수행하는 함수

1
2
3
4
5
6
7
8
9
10
11
12
    /**
     * 쿼리 파라미터 Reaplce
     */
    public String mapSqlParam( String strSql, HashMap<StringString> mapParam ) {
        String strResult = strSql.toUpperCase();
 
        forString strKey : mapParam.keySet() ) {
            strResult = strResult.replace( strKey, mapParam.get( strKey ) );
        }
 
        return strResult;
    }
cs

 

반환된 쿼리문으로 실행

1
2
Cursor cursor = database.rawQuery( strQuery, null );
database.execSQL( strQuery );
cs

 

위와 같이 처리하였습니다.

 

요약하지만...

1) 리소스의 string으로 쿼리문장을 만들고, 파라미터를 치환할 문자열로 정의합니다.

2) HashMap으로 key-value형태로 파라미터값을 생성합니다.

3) 리소스에 등록한 string을 가져와서 HashMap에 정의된 파라미터값으로 replace합니다.

    이 때, replace하는 함수를 별도 구현하여 여러곳에 사용할 수 있도록 하였습니다.

 

The End.

반응형