2016-11-01 44 views
-3

下面是一些基本的代碼:的Android SQLite的查詢()「空轉」

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

在我的應用程序中,其中()方法可以返回一個列名不爲幾個「好」的理由有: ( a)方法很複雜,我只是人類 (b)該方法返回用戶直接鍵入的值。

在兩種情況下,應用程序崩潰的預期:

SQLiteLog: (1) no such column: flag211 
AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 

如何可能(WHERE子句的甚至只是有效性)的查詢來之前發佈驗證?

或異常情況如何被困住並處理得很好?

回答

0

據我所研究,本質上沒有SQLite「空運行」設施。

但SQLite查詢()確實會拋出一個異常,可以被困,儘管缺乏明顯的文檔。

在我的問題中,我明確表示'沒有這樣的列'事件被認爲是正常的。

如果您在後臺運行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的有用提示。