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.

  • Eliminación de compilaciones de actualización de Android Studio (o Intellij) ignoradas
  • Cómo puedo obtener el ScreenSize mediante programación en android
  • ¿Cómo presionar el botón de nuevo en android programáticamente?
  • Imágenes con Idea Intellij
  • Ejemplo del Administrador de alarmas
  • Reverse Engineer Android APK para obtener el código?
  •      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?

  • R.java no se genera con Intellij Idea 12
  • Cómo cambiar el color del divisor en el listview?
  • Los nuevos URI de KitKat no responden a Intent.ACTION_VIEW
  • Pruebas de Android, ¿cómo simular multitouch (zoom in / out) utilizando instrumentos?
  • Eliminar todos los elementos dentro de lineal
  • Acceso directo a la clase de importación de Android Studio
  • 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.