2014-11-13 3 views
0

나는이 내 데이터베이스 클래스에서 다음과 같은 방법단순화 원시 SQL 문

public ArrayList<HouseType> getAllHouseTypes(AdvertTypeEnum advertTypeEnum) { 
    String language = Locale.getDefault().getLanguage(); 
    ArrayList<HouseType> houseTypes = new ArrayList<HouseType>(); 

    // Get all house types for this advert type 
    String selectQuery = "select ht._id, htt." + language + ", htat.api_id " + 
      "from house_types ht, house_types_advert_types htat, house_types_translation htt " + 
      "where ht._id=htat.house_type_id and ht._id=htt.house_type_id and htat.advert_type=?"; 

    Cursor cursor = database.rawQuery(selectQuery, new String[]{String.valueOf(advertTypeEnum.getValue())}); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      HouseType houseType = new HouseType(); 
      houseType.setId(cursor.getInt(cursor.getColumnIndex(HouseTypesDBContract.HouseTypes.COLUMN_ID))); 
      houseType.setApiId(cursor.getInt(cursor.getColumnIndex(HouseTypesDBContract.HouseTypesAdvertTypes.COLUMN_API_ID))); 
      houseType.setName(cursor.getString(cursor.getColumnIndex(language))); 
      houseType.setAdvertTypeEnum(advertTypeEnum); 

      houseTypes.add(houseType); 
     } while (cursor.moveToNext()); 
    } 
    cursor.close(); 

    return houseTypes; 
} 

안드로이드에서이 쿼리를 수행하는 청소 방법은 무엇입니까? 열 이름을 상수로 바꾸면 훨씬 더 복잡해 지므로이 작업을 수행하는 것이 더 좋은지 궁금합니다.

+0

단지의 offtopic 코멘트 : "... ...." + language + "..."'나쁜 테이블 디자인처럼 보입니다. house_types_translation은 house_types_translation (house_type_id, lang1, lang2, lang3, langN)이 아니라 house_type_id (PK (house_type_id, language), value)'... 이제 당신은 statment ...에서 언어를 선택할 수 있습니다. 또한 tab1, tab2에서 "old joins"를 사용하고 있습니다. 여기서 tab1.pk = tab2.fk' tab1에서의 join1과 같이 사용합니다. tab1에서 내부 join tab2와 같습니다. pk = tab2.fk' – Selvin

답변

0

문자열 이름에 대해 정의 된 상수를 사용합니다 (문자열 내에서 하드 코딩하는 대신). 여러 위치에서 열 이름을 사용하는 경우이 옵션을 사용하는 것이 좋습니다. 그렇지 않은 경우에도 권장됩니다.

문자열을 하드 코딩하는 데는 아무런 문제가 없습니다. 대신 연결 상수가있는 문자열을 사용하면 가독성을 위해 여러 줄에서 더 나은 방식으로 쿼리의 서식을 지정할 수 있습니다.

여러 테이블이 조인 된 쿼리가 있으므로 원시 쿼리가 올바른 방법입니다.

이러한 열 이름은 일반적으로 여러 위치에서 참조되는 이기 때문에 주로 상수를 사용하는 것이 좋습니다. 열 이름을 변경하려고하는 의 경우 릴리스하기 전에 매우 쉽게됩니다.