Datenbankzugriff über 2 Tabellen (Fremdschlüssel)

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von androidler1, 19.02.2012.

  1. androidler1, 19.02.2012 #1
    androidler1

    androidler1 Threadstarter Android-Experte

    Beiträge:
    611
    Erhaltene Danke:
    79
    Registriert seit:
    17.12.2010
    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.
     
  2. Sentence, 20.02.2012 #2
    Sentence

    Sentence Erfahrener Benutzer

    Beiträge:
    242
    Erhaltene Danke:
    51
    Registriert seit:
    27.01.2011
    Phone:
    S3, S6 Edge
    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
     
    androidler1 bedankt sich.
  3. androidler1, 20.02.2012 #3
    androidler1

    androidler1 Threadstarter Android-Experte

    Beiträge:
    611
    Erhaltene Danke:
    79
    Registriert seit:
    17.12.2010
    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.
     
  4. androidler1, 22.02.2012 #4
    androidler1

    androidler1 Threadstarter Android-Experte

    Beiträge:
    611
    Erhaltene Danke:
    79
    Registriert seit:
    17.12.2010
    Hat geholfen :) dein Link und vor allem war diese Zeile wichtig:

    db.execSQL("PRAGMA foreign_keys=ON;");
     
  5. JanF, 22.02.2012 #5
    JanF

    JanF Android-Experte

    Beiträge:
    594
    Erhaltene Danke:
    79
    Registriert seit:
    31.03.2011
    Mache sowas zwar auch, aber ich habe nicht viel mit Datenbanken gearbeitet und lasse jetzt ORM-LITE die Arbeit für mich erledigen.
    OrmLite - Lightweight Object Relational Mapping (ORM) Java Package
    Ich finds klasse, einfach per Annotationen einen Großteil der Datenbank Arbeit erledigen zu lassen.
     
    androidler1 bedankt sich.
  6. androidler1, 22.02.2012 #6
    androidler1

    androidler1 Threadstarter Android-Experte

    Beiträge:
    611
    Erhaltene Danke:
    79
    Registriert seit:
    17.12.2010
    Das ist super ;)
     
  7. lord_fritte, 25.03.2012 #7
    lord_fritte

    lord_fritte Fortgeschrittenes Mitglied

    Beiträge:
    312
    Erhaltene Danke:
    7
    Registriert seit:
    15.11.2009
    Phone:
    Samsung Galaxy S4
    Hallo, ich mache auch gerade meine ersten Versuche mit OrmLite. Aber wie macht sich so ein System im Bereich Speicherverbrauch und Performance?
     
    Zuletzt bearbeitet: 26.03.2012

Diese Seite empfehlen