Hintergrund
Ich habe ein Android-Projekt, das eine Datenbank mit zwei Tabellen hat: tbl_question
und tbl_alternative
.
Um die Ansichten mit Fragen und Alternativen zu füllen, verwende ich Cursor. Es gibt keine Probleme beim Abrufen der benötigten Daten, bis ich versuche, die beiden Tabellen zu verbinden.
Tbl_question ------------- _Ich würde Frage Kategorie ID
Tbl_alternative --------------- _Ich würde fragend Kategorie ID Alternative
Ich möchte so etwas wie das Folgende:
SELECT tbl_question.question, tbl_alternative.alternative where
categoryid=tbl_alternative.categoryid AND tbl_question._id =
tbl_alternative.questionid.`
Das ist mein Versuch:
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;
Ich finde diesen Weg zum Erstellen von Abfragen schwieriger als normales SQL, habe aber den Rat erhalten, diesen Weg zu verwenden, da er weniger fehleranfällig ist.
Frage
Wie verbinde ich zwei SQLite-Tabellen in meiner Anwendung?
Antworten:
Sie benötigen die rawQuery- Methode.
Beispiel:
Verwenden ? Bindungen, anstatt Werte in eine SQL-Rohabfrage einzufügen.
quelle
VIEW
eine bessere Option alsrawQuery
?Eine alternative Möglichkeit besteht darin, eine Ansicht zu erstellen, die dann wie eine Tabelle abgefragt wird. In vielen Datenbankmanagern kann die Verwendung einer Ansicht zu einer besseren Leistung führen.
Dies ist aus dem Speicher, so dass es einige syntaktische Probleme geben kann. http://www.sqlite.org/lang_createview.html
Ich erwähne diesen Ansatz, weil Sie dann SQLiteQueryBuilder mit der Ansicht verwenden können, da Sie impliziert haben, dass dies bevorzugt wurde.
quelle
rawQuery()
die richtige Antwort.Neben @ pawelzieba Antwort, die auf jeden Fall richtig ist, zwei Tabellen zu verbinden, während Sie ein verwenden können ,
INNER JOIN
wie diesüber rohe Abfrage wie diese -
Aufgrund der abwärtskompatiblen Unterstützung von SQLite für die primitive Art der Abfrage verwandeln wir diesen Befehl in Folgendes:
und daher in der Lage sein, die SQLiteDatabase.query () - Hilfsmethode zu nutzen
Einen detaillierten Blog-Beitrag finden Sie unter http://blog.championswimmer.in/2015/12/doing-a-table-join-in-android-without-using-rawquery
quelle
android.database.sqlite.SQLiteException: ambiguous column name
"Mehrdeutige Spalte" bedeutet normalerweise, dass derselbe Spaltenname in mindestens zwei Tabellen vorkommt. Das Datenbankmodul kann nicht sagen, welches Sie möchten. Verwenden Sie vollständige Tabellennamen oder Tabellenaliasnamen, um die Mehrdeutigkeit zu beseitigen.
Hier ist ein Beispiel, das ich zufällig in meinem Editor hatte. Es ist von einem anderen Problem, sollte aber trotzdem Sinn machen.
quelle