[기존] SQLite문으로 projection 및 selection을 받아 처리


Button btnSelection = findViewById(R.id.button_selection);
btnSelection.setOnClickListener(v -> {
String projection[] = {"ch.title", "title", "ch._id"};
String selection = "WHERE someType IS 1";
Cursor cursor = getApplicationContext().getContentResolver()
.query(uri, projection, selection, null, null);
String cursorToString = DatabaseUtils.dumpCursorToString(cursor);
textView.setText(cursorToString);
});

기존 앱에서 Room으로 DB를 바꾸며, 타 앱에 지원해 오던 ContentProvider를 구현해야 하는데


SQLite문의 projection과 selection으로 처리해오던 query를 받아낼 방법이 없음.





SQL Injection을 막기 위해서인지? Dao의 @Query에 들어가는 변수는 변수로써만 동작.


그러니까 아래 같은 거 안됨.


[X] @Query("SELECT * FROM " + Cheese.TABLE_NAME + " WHERE :selection")
List<Cheese> getItemBySelection(String selection);





[출처 mfamstory] projection - SELECT / selection - WHERE / sortOrder - ORDER BY



또 projection과 selection에서 오는 variation을 처리할 수 있어야 하는데, parsing 후 필요한 그 모든 메소드를 Dao에 만들어 내려니 노답. 양이 너무 많음.


구글링해도 내게 적용할 방법이 보이질 않아 일단 아래와 같이 처리함.





[룸 적용 후] RawQuery 대신 RoomDatabase의 query를 사용


Roomdatabase에 들어있는 이걸 가져다가,


// Below, there are wrapper methods for SupportSQLiteDatabase. This helps us track which
// methods we are using and also helps unit tests to mock this class without mocking
// all SQLite database methods.

/**
* Convenience method to query the database with arguments.
*
* @param query The sql query
* @param args The bind arguments for the placeholders in the query
*
* @return A Cursor obtained by running the given query in the Room database.
*/
public Cursor query(String query, @Nullable Object[] args) {
return mOpenHelper.getWritableDatabase().query(new SimpleSQLiteQuery(query, args));
}

/**
* Wrapper for {@link SupportSQLiteDatabase#query(SupportSQLiteQuery)}.
*
* @param query The Query which includes the SQL and a bind callback for bind arguments.
* @return Result of the query.
*/
public Cursor query(SupportSQLiteQuery query) {
assertNotMainThread();
return mOpenHelper.getWritableDatabase().query(query);
}

android/arch/persistence/room/RoomDatabase.java




외부의 query를 처리할 프로바이더의 query() 부분에 적용.


String columnList = "*";
if (projection != null) {
columnList = projectionToString(projection);
}

if(selection == null) {
selection = "";
}

RoomDatabase mDb = SampleDatabase.getInstance(getContext());
cursor = mDb.query(new SimpleSQLiteQuery("SELECT " + columnList + " FROM " + Cheese.TABLE_NAME + " " + selection));




기존처럼 DB에 RawQuery를 날리기 위해, 하드코딩을 하는 방식.


또, Room으로 DB를 변경하며 테이블 구조와 column명이 바뀌었기에... 들어온 projection, selection 각 String을 마이그레이션하는 작업도 들어가야 한다. 노답(2)



private String projectionToString(String[] projection) {
return String.join(",", new ArrayList<>(Arrays.asList(projection)));
}

-> "ch.title, title, ch._id"





그래서..


연동된 타 앱에 가이드 됐던대로, 기존에 지원하던 대로


CP query()의 projection과 selection을 새로운 RoomDatabase와 함께 사용할 수 있게 되었으나














*1  *···  *4  *5  *6  *7  *8  *9  *10  *11  *12  *···  *555 



категория N
catchP!
AdSense
Android
Carom & 3C
CounterStrike
Cryptocurrency
Cycling N
FIFA ONLINE 4 N
Gaming etc.
Music
PUBG
Soccer
Storage N
영산강 종주, 라이딩 스케치
[피파4] 532 포메이션: 5백 전술 감독 타..
[피파4] 팀컬러, 팀케미? 응답하라 94's..
[판매완료] 삼성 27인치 커브드 모니터:..
[오버클럭 후기] i7-8700k@4.9GHz, 16GB..
[판매완료] 탁스 네오 스마트/울테 스프..
[알송] mp3 파일 가사 입력 방법: 메타데..
[Android] AAC Room @RawQuery: SimpleSQ..
[판매완료] GoPro 3-Way Camera Mount:..
[스팀 인증기] 새 핸드폰 기변시 스팀가..
[PUBG] i7-8700k 업그레이드 후기 및 배..
[PUBG] 배그 그래픽/윈도우 최적화: 3D..
[i7-8700k] EZ 시스템 튜닝 벤치마크 기..
[판매완료] i7-6700 논K + ASUS H170M-PL..
[i7-8700k] CPU 순정 논오버 벤치마크 기..
[i7-6700] CPU 벤치마크 기록: HWMonitor..
[PUBG] 배그 GTX1080ti 업그레이드 후기:..
[3DMark] GTX1080ti 파스 점수: i7-6700..
[NVIDIA] 지포스 팬속 조절 방법: 엔비디..
[PUBG] 배그 자기장 초록색 변경 방법:..
[판매완료] 루디 포토닉 변색렌즈, 투명..
[판매완료] ZOTAC GTX1060 D5 6GB Mini,..
[PUBG] 배그 설정저장: 센시, 그래픽, FO..
[ACTN] 액션코인 에어드랍 이벤트: 프리..
[THETA] 세타 토큰 마이이더월렛 추가방..
[무게실측] 랭킹 크리스(Ranking Chris)..
[CS:GO] 포레스트 콘픽: f0rest.cfg, 카..
[EB코인] 이비코인 에어드랍 이벤트: 텔..
[코인채굴] Sol/s, H/s, I/s란? kSol/s,..
건형 딥스바로 할 수 있는/없는 운동 동..
count total 2,005,609, today 437, yesterday 775