tło
Mam projekt systemu Android, który ma bazę danych z dwiema tabelami: tbl_question
i tbl_alternative
.
Aby wypełnić widoki pytaniami i alternatywami, używam kursorów. Nie ma problemów z uzyskaniem potrzebnych danych, dopóki nie spróbuję połączyć dwóch tabel.
Tbl_question ------------- _ID pytanie categoryid
Tbl_alternative --------------- _ID questionid categoryid alternatywny
Chcę coś takiego:
SELECT tbl_question.question, tbl_alternative.alternative where
categoryid=tbl_alternative.categoryid AND tbl_question._id =
tbl_alternative.questionid.`
To jest moja próba:
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;
Uważam, że ten sposób tworzenia zapytań jest trudniejszy niż zwykły SQL, ale otrzymałem radę, aby używać tego sposobu, ponieważ jest mniej podatny na błędy.
Pytanie
Jak połączyć dwie tabele SQLite w mojej aplikacji?
Odpowiedzi:
Potrzebujesz metody rawQuery .
Przykład:
Posługiwać się ? wiązania zamiast umieszczania wartości w surowym zapytaniu sql.
źródło
VIEW
lepszej opcji niżrawQuery
?Alternatywnym sposobem jest utworzenie widoku, który jest następnie odpytywany tak jak tabela. W wielu menedżerach baz danych użycie widoku może skutkować lepszą wydajnością.
To pochodzi z pamięci, więc mogą wystąpić pewne problemy składniowe. http://www.sqlite.org/lang_createview.html
Wspominam o tym podejściu, ponieważ wtedy możesz użyć SQLiteQueryBuilder z widokiem, jak sugerowałeś, że jest preferowany.
źródło
rawQuery()
jest właściwą odpowiedzią.Oprócz odpowiedzi @ pawelzieba, która na pewno jest poprawna, należy dołączyć do dwóch stołów, podczas gdy można użyć
INNER JOIN
takiegoza pomocą surowego zapytania, takiego jak to -
ze względu na kompatybilność wsteczną SQLite z prymitywnym sposobem zapytań, zamieniamy to polecenie w to -
dzięki czemu można skorzystać z metody pomocniczej SQLiteDatabase.query ()
Aby uzyskać szczegółowy post na blogu, sprawdź ten http://blog.championswimmer.in/2015/12/doing-a-table-join-in-android-without-using-rawquery
źródło
android.database.sqlite.SQLiteException: ambiguous column name
„Niejednoznaczna kolumna” zwykle oznacza, że ta sama nazwa kolumny występuje w co najmniej dwóch tabelach; silnik bazy danych nie może powiedzieć, który z nich chcesz. Użyj pełnych nazw tabel lub aliasów tabel, aby usunąć niejednoznaczność.
Oto przykład, który miałem w moim edytorze. To problem kogoś innego, ale i tak powinno mieć sens.
źródło