Antecedentes
Tengo un proyecto de Android que tiene una base de datos con dos tablas: tbl_question
y tbl_alternative
.
Para poblar las vistas con preguntas y alternativas, estoy usando cursores. No hay problemas para obtener los datos que necesito hasta que intento unir las dos tablas.
Tbl_question ------------- _carné de identidad pregunta categoria ID
Tbl_alternative --------------- _carné de identidad questionid 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 que esta forma de formular consultas es más difícil que el SQL normal, pero he recibido el consejo de usar esta forma ya que es menos propenso a errores.
Pregunta
¿Cómo puedo unir dos tablas SQLite en mi aplicación?
Respuestas:
Necesita el método rawQuery .
Ejemplo:
Utilizar ? enlaces en lugar de poner valores en una consulta SQL sin formato.
fuente
VIEW
una mejor opción querawQuery
?Una forma alternativa es construir una vista que luego se consulta como una tabla. En muchos administradores de bases de datos, el uso de una vista puede resultar en un mejor rendimiento.
Esto es de memoria, por lo que puede haber algunos problemas sintácticos. http://www.sqlite.org/lang_createview.html
Menciono este enfoque porque luego puede usar SQLiteQueryBuilder con la vista, ya que insinuó que era la preferida.
fuente
rawQuery()
es la respuesta correcta.Además de la respuesta de @ pawelzieba, que definitivamente es correcta, para unir dos tablas, mientras que puedes usar una
INNER JOIN
como estaa través de una consulta sin procesar como esta -
debido a la compatibilidad con versiones anteriores de SQLite de la forma primitiva de consulta, convertimos ese comando en esto:
y, por lo tanto, poder aprovechar el método auxiliar SQLiteDatabase.query ()
Para obtener una publicación de blog detallada, consulte este http://blog.championswimmer.in/2015/12/doing-a-table-join-in-android-without-using-rawquery
fuente
android.database.sqlite.SQLiteException: ambiguous column name
"Columna ambigua" generalmente significa que el mismo nombre de columna aparece en al menos dos tablas; el motor de la base de datos no puede decir cuál desea. Utilice nombres de tablas completos o alias de tablas para eliminar la ambigüedad.
Aquí hay un ejemplo que tuve en mi editor. Es del problema de otra persona, pero debería tener sentido de todos modos.
fuente