2016-11-01 102 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的有用提示。