"We are back" « oc.at

Kurze Java Frage

tinker 30.10.2008 - 16:25 2617 29
Posts

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5249
Wie kann ich in Java auf den aktuellen Projekt-Pfad zugreifen? Ich bilde mir ein das ging mit ner System-Propertie, ich find aber keine passende.

Ich greif zZ nämlich mit dem absoluten Pfad auf zb. Config-Files zu, jetzt will ich das mal ändern, nur mir fällt nicht ein wie das nochmal frunktioniert.

tia
Bearbeitet von tinker am 30.10.2008, 16:51

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12125
Meinst du damit den Pfad, in dem deine Executable liegt, oder den Pfad, wo du dich beim Aufruf des Programms befindest?

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5249
letzteres

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12125

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5249
thx, das wars. hab ich bei den System-Properties wohl übersehen...

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12125
Ich finde diese Property auch ziemlich besch...eiden benannt, ehrlich gesagt. Ueberall sonst heiszt das "working directory", oder zumindest so aehnlich. Intuitiv wuerde ich, wenn ich "user.dir" lese, auf eine Rueckgabe des Home-Directories des jeweiligen Nutzers, der das Programm gerade ausfuehrt, tippen.

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5249
Sowas hab ich mir auch gedacht, als ich mit die Propertys angeschaut hab, desshalb hab ich übers user.dir wohl auch drüber gelesen

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5249
Ich hängs mal hier dazu:

Folgendes Problem:
Hab ne Klasse mit zwei Listen (values und values2) die in der Methode init initialisiert werden. Problem: Wenn ich mir Daten aus der DB holen und sie in die Liste values schreibe, befinden sich nach dem Ende des Schleifendurchlaufs die selben Daten auch in der Liste values2...

Code:
public class AddChangeTableModel extends javax.swing.table.AbstractTableModel {

    private int id;
    private Area area;
    private List<String> cols;
    private List<Data> values;
    private List<Data> values2;

    /** Creates a new instance of AddChangeTableModel */
    public AddChangeTableModel(List<String> cols, List<Data> values, Area area, int id) {
        this.area = area;
        this.cols = cols;
        this.values = values;        
        this.values2 = values;
        this.id = id;

        init();
    }

    private void init() {
        Map<String, String> row = null;
        if (id != 0) {
            row = DataAccess.getRow(area, id);

            // values und values2 beide leer
            
            for (Data data : values) {
                data.setData(row.get(data.getDbField()));
            }
            
            // values und values2 beide mit den selben Werten befüllt... WTF?

            [...]
        }
    }
}
Ich checks grad voll net, also bitte um Hilfe!

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
eventuell weil values & values2 auf dasselbe objekt verweisen?

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5249
Jop, bei mir haperts anscheinend etwas an den Basics...

Maekloev

linux addicted
Avatar
Registered: Oct 2002
Location: Absam
Posts: 920
gibt es einen speziellen grund, weshalb du zwei listen (values und values2) benötigst? der grund, weshalb deine daten redundant sind, befindet sich in zeile 13-14. soll die zweite liste irgend etwas spezielles bezwecken (maybe andere sortierung, ...)?

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5249
Das mit der redundanz hab ich schon gelöst, hab das mit den Referenzen irgendwie übersehen/nicht daran gedacht.

Und wegen der zwei Listen:
Die Listen beinhalten Objekte des Typs Data. Data ist ne eigene Java-Klasse die einige Attribute enthält. Bei den meisten Attributen handelt es sich um Metadaten (dbName, displayName, type, ...). Zusätzlich gibt es noch das Attribut data, das den tatsächlichen Wert des Eintrags beinhaltet.

In der Datenbank gibt es zwei Tabellen die ziemlich ähnlich sind (sprich, die Metadaten sind gleich). An den Konstruktor der AddChangeTableModel Klasse wird jetzt eine List<Data> übergeben, wobei in den Data-Objekten nur die Metadaten befüllt sind.

Tja, und in der init()-Methode geh ich dann her und hol mir in Zeile 23 die Werte für die erste Liste aus der Datenbank und befülle dann die data-Attribute der ersten Liste mit den Werten (Zeile 28).

Anschließend passiert das selbe mit der zweiten Liste, nur greif ich dann natürlich auf eine andere Tabelle zu.

Maekloev

linux addicted
Avatar
Registered: Oct 2002
Location: Absam
Posts: 920
Zitat
In der Datenbank gibt es zwei Tabellen die ziemlich ähnlich sind (sprich, die Metadaten sind gleich).

vielleicht ist gerade das das problem. beim datenbankentwurf (dazu gehört unter anderem die wahl der attribute für eine tabelle) sollte man stets darauf achten, möglichst keine redundanzen zu haben, da es sonst leicht zu anomalien (z.b. inkonsistenzen) kommen kann. eine tabelle sollte so wenig attribute wie möglich haben. wenn das nicht der fall ist, sollten diese in mehrere kleine zerlegt werden (stichwort normalformen). mittels join von je zwei tabellen über ein attribut erhält man dann genau die daten, die man sucht. einer der vorteile ist, dass so die wahrscheinlichkeit einer möglicherweise inkonsistenten datenbank (z.b. beim löschen eines interpreten, eines albums etc.) minimiert wird.

vielleicht kannst du das schema deiner tabelle ja mal kurz skizzieren. wenn dieses in ordnung ist, sollte nur mehr eine liste in java notwendig sein.

ich muss dazu sagen, dass ich mit dieser variante der datenbank-anbindung nicht vertraut bin. ich habe bisher jdbc verwendet (siehe openbook auf galileocomputing). die über diese schnittstelle abgefragten tupel werden in einer so genannten ResultSet gespeichert, über die auf sehr einfache art und weise mit next() iteriert werden kann (s. beispiel).

wie dem auch sei... vielleicht ist es hilfreich, wenn du - wie erwähnt - mal die schemata der beiden tabellen postest.

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5249
Das mit dem DB-Entwurf ist mir klar. Nur stammt dieser nicht von mir, sondern vom Kunden. Desshalb kann ich auch nicht genau auf das Beispiel eingehen, da hätte er wohl was dagegen. Aber ich versuchs mal allgemein:

TabelleA (1 : n) TabelleB

TabelleA:
ID (pk)
Attr1
Attr2
Attr3

TabelleB:
ID (pk)
TabAID (fk)
Attr1
Attr2
Attr3

In beiden Tabellen befindet sich die gleichen Spalten, nur mit unterschiedlichen Daten. Bei TabelleB wird auch ein Datensatz aus TabelleA angegeben. Das heißt, wenn zb. Attr1 in TabelleB keinen Wert zugewiesen hat, ist der Werte in TabelleA gültig.

Und zwecks Datenbank-Anbindung: Passiert auch über jdbc, der direkte Zugriff befindet sich nur hinter meiner eigengen DataAccess-Klasse. In der Funktion getRow (Zeile 23) wird das ResultSet einfach in eine Map gepackt. Damit kann es mir egal sein wie die Datenbank-Anbindung dahinter ausschaut, weil ich immer eine Map(dbname, value) zurückbekomme.
Bearbeitet von tinker am 28.11.2008, 09:09

Maekloev

linux addicted
Avatar
Registered: Oct 2002
Location: Absam
Posts: 920
ok, alles klar. nette lösung. na wenn der kunde das unbedingt so wünscht, sollte man diesem wunsch auch nachkommen. ich kann mich noch erinnern, dass unser prof. damals uns vor solchen situationen gewarnt hat. man solle, wenn der kunde explizit keine normalformen will, eine schriftliche bestätigung einfordern, um auf nummer sicher zu gehen. :)

natürlich ist es dennoch möglich, die beiden tabellen konsistent zu halten. nur muss man dann halt selber im java-programm dafür sorgen, dass das auch der fall ist.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz