Datenbankzugriff über 2 Tabellen (Fremdschlüssel)

androidler1

androidler1

Stammgast
79
Hallo,

ich habe gegoogelt aber leider nichts passendes gefunden.

Ich habe zum Beispiel 2 Tabellen angelegt. Mit folgenden Namen und Inhalt als Beispiel.
Tabelle: Klasse
ID---------Klasse
5----------Umsatzerlöse

Tabelle: Konto
KtoNr--------Bezeichnung---------Klasse(Fremdschlüssel von oben)
50-----------Handelswaren-----------5

So sehen die Queries zum Anlegen der Tabellen aus:
Code:
private static final String CREATE_KLASSE = "Create table if not exists "
			+ MY_DB_TABLE_KLASSE + " ( id integer primary key, "
			+ "klasse varchar(50) );";

private static final String CREATE_KONTO = "Create table if not exists "
			+ MY_DB_TABLE_KTO + " ( KtoNr integer primary key, "
			+ "bezeichnung varchar(100), " + 
			"Klasse references " + MY_DB_TABLE_KLASSE + "(id) );";
Zum Einfügen in die Tabelle Konto gehe ich so vor:
Code:
ContentValues values = new ContentValues();
		
		try{
			values.put("ktonr", "50");
			values.put("bezeichnung", "Handelswaren");
			values.put("klasse", [COLOR="Red"][B]5[/B][/COLOR]);
			myDB.insert(MY_DB_TABLE_KTO, null, values);
		}catch(SQLException e){
			System.out.println("FEHLER INSERT KONTO");
		}
Was mir hier schon beim Einfügen auffällt, dass wenn ich anstatt der roten 5 (oben im Code) eine 10 eingebe, dann bekomm ich keine Fehlermeldung zurück, da es ja keinen Datensatz in der Tabelle Klassen mit dem Primärschlüssel 10 gibt. Warum wird hier nicht überprüft ob es einen Datensatz mit der 10 in Klasse gibt??

Nun ja, das eigentliche Problem ich lese jetzt die Daten aus der Tabelle Konto aus und bekommen folgende ausgabe mit dem Code hier:
Code:
Cursor c = myDB.query(MY_DB_TABLE_KTO, null, null, null, null, null, null);
		c.moveToFirst();
		t.setText("");
		while(c.isAfterLast()==false){
			t.append("\n" + c.getString(0)+ " | "+c.getString(1) + " | " + c.getString(2));
			c.moveToNext();
		}
		c.close();
Ausgabe: 50 | Handelswaren | 5
Ich möchte aber anstatt der grünen 5 hier Umsatzerlöse stehen haben.
D.h. ich muss ja einen Join(where) machen, aber wie mache ich das ohne die komplette Query selber zu schreiben.
 
Moin,
schau dir mal dies an SQLite Foreign Key Support
Du musst mit Foreign Keys arbeiten.

Diese musste du meines wissens nach in SQLite bei Android explizit einschalten.
In deiner SQLiteOpenHelper zb so
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
if (!db.isReadOnly()) {
// Enable foreign key constraints
db.execSQL("PRAGMA foreign_keys=ON;");
}
}

Für die Joins kannst du entweder die rawQuery nehmen, oder dir den Query mit dem SQLiteQueryBuilder SQLiteQueryBuilder | Android Developers zusammenbauen.

MfG
 
  • Danke
Reaktionen: androidler1
Danke für deine Antwort, werde es mal so versuchen. Bei Fragen meld ich mich nochmals :)
Dachte schon, dass hier niemenad sowas mit der DB macht.
 
Hat geholfen :) dein Link und vor allem war diese Zeile wichtig:

db.execSQL("PRAGMA foreign_keys=ON;");
 
Hallo, ich mache auch gerade meine ersten Versuche mit OrmLite. Aber wie macht sich so ein System im Bereich Speicherverbrauch und Performance?
 
Zuletzt bearbeitet:

Ähnliche Themen

R
Antworten
6
Aufrufe
994
swa00
swa00
S
Antworten
4
Aufrufe
4.368
mblaster4711
mblaster4711
L
Antworten
5
Aufrufe
813
swa00
swa00
Zurück
Oben Unten