Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo unir dos tablas SQLite en mi aplicación de Android?

Fondo

Tengo un proyecto de Android que tiene una base de datos con dos tablas: tbl_question y tbl_alternative .

Para rellenar las vistas con preguntas y alternativas estoy usando cursores. No hay problemas en obtener los datos que necesito hasta que intente unirme a las dos tablas.

  • Firebase disparando demasiadas alarmas
  • Conversión de PCM a AAC mediante mediacodec
  • La aplicación de Android no es compatible con Samsung galaxy S4
  • SurfaceView, SurfaceTexture y MediaPlayer no pueden reproducir mi video en android
  • View.OnClickListener, el método o la clase?
  • Cómo habilitar multidexing con la nueva biblioteca de soporte de Android Multidex
  •      Tbl_question  
         -------------
         _carné de identidad  
         pregunta  
         categoria ID  
    
         Tbl_alternative
         ---------------
         _carné de identidad 
         Pregunta 
         categoria ID 
         alternativa
    

    Quiero algo como lo siguiente:

     SELECT tbl_question.question, tbl_alternative.alternative where categoryid=tbl_alternative.categoryid AND tbl_question._id = tbl_alternative.questionid.` 

    Este es mi intento:

     public Cursor getAlternative(long categoryid) { String[] columns = new String[] { KEY_Q_ID, KEY_IMAGE, KEY_QUESTION, KEY_ALT, KEY_QID}; String whereClause = KEY_CATEGORYID + "=" + categoryid +" AND "+ KEY_Q_ID +"="+ KEY_QID; Cursor cursor = mDb.query(true, DBTABLE_QUESTION + " INNER JOIN "+ DBTABLE_ALTERNATIVE, columns, whereClause, null, null, null, null, null); if (cursor != null) { cursor.moveToFirst(); } return cursor; 

    Encuentro esta manera de formar consultas más duro que el SQL regular, pero he conseguido el consejo para utilizar esta manera puesto que es menos propenso de error.

    Pregunta

    ¿Cómo unir dos tablas SQLite en mi aplicación?

  • Android Studio con dos monitores
  • ¿Existe ya una clase StopWatch para android y por qué no funciona mi implementación?
  • ¿Deberíamos preferir AdMob en los servicios de Google Play en comparación con el "antiguo" SDK de AdMob
  • CreateFromStream en Android devolviendo null para determinada URL
  • ¿Qué hay de nuevo en Drawable Tinting en Android L Developer Preview en comparación con la versión anterior?
  • Detectar cuando el roaming está desactivado en Android
  • 4 Solutions collect form web for “¿Cómo unir dos tablas SQLite en mi aplicación de Android?”

    Necesita el método rawQuery .

    Ejemplo:

     private final String MY_QUERY = "SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.other_id WHERE b.property_id=?"; db.rawQuery(MY_QUERY, new String[]{String.valueOf(propertyId)}); 

    Utilizar ? Bindings en lugar de poner valores en raw sql query.

    Una forma alternativa es construir una vista que se consulta como una tabla. En muchos administradores de bases de datos que utilizan una vista puede resultar en un mejor rendimiento.

     CREATE VIEW xyz SELECT q.question, a.alternative FROM tbl_question AS q, tbl_alternative AS a WHERE q.categoryid = a.categoryid AND q._id = a.questionid; 

    Esto es de la memoria por lo que puede haber algunos problemas sintácticos. http://www.sqlite.org/lang_createview.html

    Menciono este enfoque porque entonces se puede usar SQLiteQueryBuilder con la vista, ya que implica que se prefiere.

    "Columna ambigua" normalmente significa que el mismo nombre de columna aparece en al menos dos tablas; El motor de base de datos no puede decir cuál desea. Utilice nombres de tablas completas o alias de tabla para eliminar la ambigüedad.

    He aquí un ejemplo que tuve en mi editor. Es de algún otro problema, pero debe tener sentido de todos modos.

     select P.* from product_has_image P inner join highest_priority_images H on (H.id_product = P.id_product and H.priority = p.priority) 

    Además de la respuesta de @ pawelzieba, que definitivamente es correcta, para unir dos tablas, mientras que usted puede utilizar un INNER JOIN como este

     SELECT * FROM expense INNER JOIN refuel ON exp_id = expense_id WHERE refuel_id = 1 

    A través de una consulta en bruto como ésta –

     String rawQuery = "SELECT * FROM " + RefuelTable.TABLE_NAME + " INNER JOIN " + ExpenseTable.TABLE_NAME + " ON " + RefuelTable.EXP_ID + " = " + ExpenseTable.ID + " WHERE " + RefuelTable.ID + " = " + id; Cursor c = db.rawQuery( rawQuery, null ); 

    Debido a la compatibilidad retroactiva de SQLite de la forma primitiva de consulta, volvemos ese comando en esto –

     SELECT * FROM expense, refuel WHERE exp_id = expense_id AND refuel_id = 1 

    Y por lo tanto ser capaz de tomar advanatage del método de ayuda SQLiteDatabase.query ()

     Cursor c = db.query( RefuelTable.TABLE_NAME + " , " + ExpenseTable.TABLE_NAME, Utils.concat(RefuelTable.PROJECTION, ExpenseTable.PROJECTION), RefuelTable.EXP_ID + " = " + ExpenseTable.ID + " AND " + RefuelTable.ID + " = " + id, null, null, null, null ); 

    Para ver una postura detallada en el blog, vea http://blog.championswimmer.in/2015/12/doing-a-table-join-in-android-without-using-rawquery

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.