Potrebbe l'eccezione di runtime (colonna list_id non esiste) provengono da sinistra unirsi?

voti
0

Nel mio progetto Studio Android Ho implementato un database (gestito da camera). Nel mio file Dao, ho la seguente query che causa un errore:

SELECT tab1.list_id, ... FROM  
            (SELECT list_id, ...  FROM list_table) AS tab1  
            LEFT JOIN  
            (SELECT list_id, ...  FROM list_table NATURAL JOIN product_table NATURAL JOIN list_product_table GROUP BY list_id) AS tab2  
            ON tab1.list_id = tab2.list_id  
            ORDER BY list_position ASC, tab1.list_id ASC;

L'errore dice java.lang.IllegalArgumentException: column '`list_id`' does not exist. L'errore punta al file, che è stato creato automaticamente da camera.

...
return __db.getInvalidationTracker().createLiveData(new String[]{list_table,product_table,list_product_table}, false, new Callable<List<ShoppingListDisplayValues>>() {
      @Override
      public List<ShoppingListDisplayValues> call() throws Exception {
        final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
        try {
          final int _cursorIndexOfPosition = CursorUtil.getColumnIndexOrThrow(_cursor, list_position);
          final int _cursorIndexOfId = CursorUtil.getColumnIndexOrThrow(_cursor, list_id);
          ...

Per essere più precisi, i punti di errore alla linea:

final int _cursorIndexOfId = CursorUtil.getColumnIndexOrThrow(_cursor, list_id);

Ora la mia domanda è, questo risultato di errore da sinistra potrebbe unirsi? La cosa veramente strana è, che il codice funziona su alcuni dispositivi e su altri no. Sarebbe davvero contento, se qualcuno ha un'idea.

È pubblicato 02/12/2019 alle 23:55
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Così, dopo il debug di un paio d'ore ho trovato l'errore e una soluzione.

origine errore

Le bugie di errore nella libreria di persistenza camera. Quando si utilizza questa libreria su dispositivi con API inferiore a 27 (almeno questo è quello che credo, dal momento che ho provato 3 dispositivi con differenti API), quindi un'eccezione si butta SE si utilizza un prefisso tabella nel SELECTcomunicato. Con il termine "prefisso delle tabelle" Voglio dire, per esempio l' tab1.in tab1.list_id.

La soluzione:

Basta usare un alias per la colonna che ha un prefisso delle tabelle. Invece di

SELECT tab1.list_id, ... FROM

Scrivi

SELECT tab1.list_id AS list_id, ... FROM

Risposto il 03/12/2019 a 01:38
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more