2016-11-01 5 views
-3

몇 가지 기본적인 코드입니다 : (내 응용 프로그램에서안드로이드 SQLite는 쿼리() 여기 DRY RUN '

where(); // Generates "flag0 = 'R' AND (flag211 & 1) == 1" 
return database.query(RT, minColumns(), where(), null, null, null, orderby()); 

를 Where() 여러'좋은 '이유가 존재하지 않는 열 이름을 반환 할 수 있습니다 방법 a) 방법은 복잡하고 나는 인간 일뿐입니다. (b)이 메소드는 사용자가 직접 입력 한 값을 반환합니다. 어느 경우에

, 예상대로 응용 프로그램이 충돌 :

(WHERE 절 또는 심지어 그냥 유효 기간) 쿼리가 발행 이전에 검증 할 수있는 방법
SQLiteLog: (1) no such column: flag211 
AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 

?

또는 어떻게 예외를 잡아두고 잘 처리 할 수 ​​있습니까?

답변

0

내가 연구 한 한, SQLite '드라이 런'시설 자체는 없습니다.

그러나 SQLite query()는 눈에 띄지 않는 문서가 없어도 트랩 될 수있는 예외를 throw합니다.

내 질문에 '열이 없다'는 것이 정상적인 것으로 간주된다는 것을 분명히했습니다.

백그라운드에서 query()를 실행하는 경우 테스트 한 방법으로 이벤트를 트래핑하고 사용자에게 정중하게 알립니다.

public Cursor gimme(Activity A, String where, String orderby, String subFilter) { 
    try {return database.query(WAYPOINT, stdColumnsW(subFilter), where, null, null, null, orderby);} 
    catch (Exception e) { runToast(e.getMessage(), A); return null; } 
} 

// 'Toast' does not run in background thread! 
private void runToast (String bigMsg, Activity A) { 
    // e.g. no such column: flag211 (code 1): , while compiling: SELECT _id, ... ... ... 
    int comma = bigMsg.indexOf(","); 
    if (comma < 0) comma = (int)Math.min(50D, (double)bigMsg.length()); 
    final String msg = bigMsg.substring(0, comma); 
    A.runOnUiThread(new Runnable() { 
     @Override 
     public void run() {Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show();}); 
    } 

유용한 팁은 @Catluc에게 감사드립니다.