db4o Developer Community

db4o open source object database, native to Java and .NET
Welcome to db4o Developer Community Sign in | Join
in Search
More Search Options

Problem: Vektor oder Liste als Attribut speichern

Last post 09-02-2008, 12:08 PM by DaveTheViking. 10 replies.
Sort Posts: Previous Next
  •  08-27-2008, 04:34 PM 50805

    Problem: Vektor oder Liste als Attribut speichern

    Ich bin hier halb am verzweifeln:

    In meiner Datenbank sollen bestimmte IDs gespeichert werden, und zwar unabhängig von den anderen Objekten. Meine Idee war daher, ein Objekt ID in der Datenbank zu speichern, in welchem ich die IDs in einen Vektor oder einer Liste speichere. Mein Code für das Objekt ID sieht so aus:

    public class ID
    {
        static Vector<Integer> ids = new Vector<Integer>();
        public void addId(int i)
        {
            ids.add(i);
        }

        public boolean searchID(int i)
        {
            return ids.contains(i);
        }
       
        public int generateRandomID()
        {
            int i = (int)(Math.random()*1000000000);
            while(ids.contains(i))
                i = (int)(Math.random()*1000000000);
            return i;
        }
       
        public void deleteID(int i)
        {
            ids.remove(ids.indexOf(i));
        }
       
        public void printIDs()
        {
            System.out.println(ids.size());
            for(int i = 0; i < ids.size(); i++)
                System.out.println(ids.get(i));
        }

    }

     

    Aufruf:

    public void test()
        {
            ID i = retrieveIDs();
            i.addId(12);
            i.printIDs();
            db.store(i);
        }

    Wenn ich jetzt in meiner Datenbank irgendwo eine ID erstelle, sollte ich sie in ID speichern können (bzw. dem Vektor in ID), indem ich add() aufrufe. Das Problem ist, dass nichts gespeichert wird! Wenn ich in der gleichen Instanz IDs speichere, kann ich sie auch mit printIDs() auslesen. Sobald ich die Datenbank neu öffne, sind alle Daten im Vektor wieder verschwunden.

    Ich hab keine Ahnung woran es liegt! Hab es auch schon mit einer Liste ausprobiert.

     

    Wer kann mir helfen?

  •  08-28-2008, 05:45 AM 50810 in reply to 50805

    Re: Problem: Vektor oder Liste als Attribut speichern

    ich glaube du hast da einen kleinen denkfehler drin:

    bevor du neue id's zu deinem ID-Objekt in der Datenbank hinzufügen kannst, musst du es erst aus der datenbank laden. ansonsten legt db4o für jeden aufruf dieser funktion ein neues ID Objekt an.

    perus

  •  08-28-2008, 08:40 AM 50812 in reply to 50810

    Re: Problem: Vektor oder Liste als Attribut speichern

    Das mache ich mit der Methode

        public ID retrieveIDs()
        {
            ObjectSet<ID> ids = db.get(ID.class);
            return ids.next();
        }

  •  08-28-2008, 09:50 AM 50813 in reply to 50805

    Re: Problem: Vektor oder Liste als Attribut speichern

  •  08-28-2008, 02:48 PM 50816 in reply to 50813

    Re: Problem: Vektor oder Liste als Attribut speichern

    Danke für den Hinweis!

     

    Jedesmal wenn ich jetzt die Datenbank zum arbeiten öffne, konfiguire ich jetzt die Klasse ID.java:

    public void openDB()
        {
            db=Db4o.openFile("daten.yap");
            db.ext().configure().objectClass(ID.class).updateDepth(2);
            db.ext().configure().objectClass(ID.class).cascadeOnUpdate(true);
            db.ext().configure().objectClass(ID.class).cascadeOnActivate(true);
           
        }

     

    Aber es funktioniert immer noch nicht... Habe ich noch irgendwo einen Denkfehler?

  •  08-28-2008, 03:02 PM 50817 in reply to 50816

    Re: Problem: Vektor oder Liste als Attribut speichern

    DaveTheViking:

    Aber es funktioniert immer noch nicht... Habe ich noch irgendwo einen Denkfehler?

    Ja, die Datenbankkonfiguration muss immer vor dem Öffnen der Datenbank aufgerufen werden, damit sie einen Effekt hat. Also:

    db.ext().configure().objectClass(ID.class).updateDepth(2);
    db.ext().configure().objectClass(ID.class).cascadeOnUpdate(true);
    db.ext().configure().objectClass(ID.class).cascadeOnActivate(true);

    db=Db4o.openFile("daten.yap");

    Grüße, Maik


    http://db4o.blogspot.com/
  •  08-30-2008, 06:54 AM 50839 in reply to 50817

    Re: Problem: Vektor oder Liste als Attribut speichern

    Tut mir leid wenn ich Euch hier zur Verzweiflung bringe... aber vielen Dank für die Hilfestellung!

     

    Ich habe Deinen Vorschlag ausprobiert, aber beim Ausführen des Programms bekomme ich eine NullpointerException wenn ich auf db.ext().* das erste mal zugreife. Deshalb hab ich nochmals im Tutorial nachgeschaut und das hier ausprobiert:

     

    public void openDB()
        {
            Configuration c = Db4o.configure();
            c.objectClass(ID.class).updateDepth(2);
            c.objectClass(ID.class).cascadeOnUpdate(true);
            c.objectClass(ID.class).cascadeOnActivate(true);
           
            db=Db4o.openFile(c, "daten.yap");
            /*db.ext().configure().objectClass(ID.class).updateDepth(2);
            db.ext().configure().objectClass(ID.class).cascadeOnUpdate(true);
            db.ext().configure().objectClass(ID.class).cascadeOnActivate(true);
           
            db=Db4o.openFile( "daten.yap");*/
           
        }

     Ich habe also Deinen Hinweis auf das konfigurieren der Datenbank VOR dem Öffnen beachtet... Aber leider funktioniert es immer noch nicht.

     

    MfG, David

  •  08-30-2008, 08:31 AM 50842 in reply to 50839

    Re: Problem: Vektor oder Liste als Attribut speichern

    DaveTheViking:

    Tut mir leid wenn ich Euch hier zur Verzweiflung bringe... aber vielen Dank für die Hilfestellung!

    Hallo David!

    Von Verzweiflung sind wir ja noch weit entfernt...;-)

    Stimmt, dass mit db.ext() macht ja auch keinen Sinn, solange db nicht initialisiert ist. Für db.ext() könntest Du einfach Db4o.configure() einsetzen, dann würdest Du damit die Default-Config ändern. Im Prinzip müsste also das folgende funktionieren:

    Db4o.configure().objectClass(ID.class).updateDepth(2);
    Db4o.configure().objectClass(ID.class).cascadeOnUpdate(true);
    Db4o.configure().objectClass(ID.class).cascadeOnActivate(true);
    db=Db4o.openFile("daten.yap");

    Aber das ist ja in etwa das, was Du machst, ich habe aber keine Ahnung, was passiert, wenn man Db4o.openFile() wieder die Default-Config als ersten Parameter reinfüttert... sollte aber vermutlich kein Problem sein.

    Kannst Du evtl. mal ein kleines komplettes Beispiel posten (samt public static void main(String[] args){...}), so dass man das direkt mal mit Copy&Paste testen kann, an dem ich das Problem nachvollziehen kann. Vermutlich sieht man auf diese Weise viel schneller, ob und wo Du da evtl. noch einen Denkfehler drin hast.

    Grüße, Maik


    http://db4o.blogspot.com/
  •  09-01-2008, 09:59 AM 50857 in reply to 50842

    Re: Problem: Vektor oder Liste als Attribut speichern

    Hier ist das Beispiel:

     

    package DB;

    import java.io.File;


    import com.db4o.Db4o;
    import com.db4o.ObjectContainer;
    import com.db4o.ObjectSet;
    import com.db4o.config.Configuration;

    public class DBMain
    {
        static ObjectContainer db;
       
        public DBMain()
        {
       
            boolean set = new File("test.yap").exists()? false: true;
            if(set)
            {
                db=Db4o.openFile("test.yap");
                db.store(new ID());
                db.close();
            }
           
        }
       
        public void openDB()
        {
            Db4o.configure().objectClass(ID.class).updateDepth(2);
            Db4o.configure().objectClass(ID.class).cascadeOnUpdate(true);
            Db4o.configure().objectClass(ID.class).cascadeOnActivate(true);
            db=Db4o.openFile("test.yap");
        }
       
        public void closeDB()
        {
            db.close();
        }
       
        public ID retrieveIDs()
        {
            ObjectSet<ID> ids = db.get(ID.class);
            return ids.next();
        }
       
        public void retrieveID()
        {
            ObjectSet<ID> ids = db.get(ID.class);
            System.out.println(ids.size());
        }
       
        public void test()
        {
            ID i = retrieveIDs();
            i.addId(12);
            db.store(i);
            ID ii = retrieveIDs();
            ii.printIDs();
        }
       
        public static void main(String[] args)
        {
            DBMain daten = new DBMain();
            daten.openDB();
            daten.test();
            daten.closeDB();
        }
    }

     

    Die Klasse ID habe ich schon gepostet so weit ich weiß...

    Bei mir funktioniert es so auch nicht.

     

    David

  •  09-01-2008, 03:22 PM 50860 in reply to 50857

    Re: Problem: Vektor oder Liste als Attribut speichern

    Hi David,

    das größte Problem steht natürlich schon direkt am Anfang des Threads, aber das habe ich natürlich beim bloßen Draufgucken auch übersehen. Du hast den Vector ids als static deklariert, was natürlich wenig Sinn macht, da Du ja mit einer Instanz von ID arbeiten willst. Anbei ist ein Beispiel, wo es jetzt meiner Meinung nach funktioniert, kannst Du ja mal testen. Die Ausgabe ist das, was man erwartet:

    [0]
    [0, 1]
    [0, 1, 2]
    [0, 1, 2, 3]
    [0, 1, 2, 3, 4]
    [0, 1, 2, 3, 4, 5]
    [0, 1, 2, 3, 4, 5, 6]
    [0, 1, 2, 3, 4, 5, 6, 7]
    [0, 1, 2, 3, 4, 5, 6, 7, 8]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    Grüße, Maik

     

    import java.io.File;
    import java.util.Vector;

    import com.db4o.Db4o;
    import com.db4o.ObjectContainer;
    import com.db4o.config.Configuration;

    public class ID {
        Vector<Integer> ids = new Vector<Integer>();

        public void addId(int i) {
            ids.add(i);
        }

        public String toString() {
            return ids.toString();
        }

        public static void main(String[] args) {
            new File("test.yap").delete();

            Configuration config = Db4o.newConfiguration();        
            config.objectClass(ID.class).cascadeOnUpdate(true);

            // Anlegen eines ID-Behälters
            ObjectContainer db = Db4o.openFile(config, "test.yap");
            db.store(new ID());
            db.commit();
            db.close();

            // Jetzt öffnen, lesen, updaten und schließen wir die Datenbank 10mal.
            // Das Öffnen/Schließen ist nur für den Test so gemacht,
            // in produktiven Anwendungen bleibt die Datenbank natürlich geöffnet.
            for (int i = 0; i < 10; i++) {
                db = Db4o.openFile(config, "test.yap");
                ID id = (ID) db.queryByExample(ID.class).next();
                id.addId(i);
                db.store(id);
                db.commit();
                System.out.println(db.queryByExample(ID.class).next());
                db.close();
            }
        }
    }


    http://db4o.blogspot.com/
  •  09-02-2008, 12:08 PM 50876 in reply to 50860

    Re: Problem: Vektor oder Liste als Attribut speichern

    Autsch!

    Ja klar, das hatte ich auch komplett übersehen mit dem static. Was ich mir dabei gedacht habe, kann ich jetzt auch nicht mehr nachvollziehen.

    In Deinem Beispiel hast Du jetzt auch garnicht mehr die Updatetiefe gesetzt sondern nur noch cascadeOnUpdate.

    Super! Vielen Dank nochmal!

     

    David

View as RSS news feed in XML