2016-11-01 3 views
-3

Hier einige grundlegende Code:android SQLite query() 'DRY RUN'

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

In meiner Anwendung der where() -Methode kann einen Spaltennamen zurück, die nicht für mehrere 'gute' Gründe existiert: (a) Die Methode ist komplex und ich bin nur ein Mensch (b) Die Methode gibt einen Wert zurück, der direkt vom Benutzer eingegeben wurde.

In jedem Fall stürzt die Anwendung wie erwartet:

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

Wie kann die Abfrage (oder auch nur die Gültigkeit der WHERE-Klausel) der Ausgabe vor validiert werden?

ODER Wie kann die Ausnahme gefangen und gut behandelt werden?

Antwort

0

Soweit ich recherchiert habe, gibt es keine SQLite 'Trockenlauf' Einrichtung per se.

Aber SQLite query() wirft eine Ausnahme, die trotz eines Mangels an offensichtlich offensichtlichen Dokumentation gefangen werden kann.

In meiner Frage habe ich klargestellt, dass ein Ereignis "keine solche Spalte" als normal anzusehen ist.

Wenn Sie query() im Hintergrund ausführen, ist hier eine getestete Methode zum Einfangen des Ereignisses AND, die den Benutzer höflich benachrichtigt.

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();}); 
    } 

Dank @Catluc für den nützlichen Tipp.