Erstellte Database wird im DDMS nicht angezeigt

  • Hallo Leute,


    ich arbeite mich gerade in sqLite ein. habe ein demo projekt runtergeladen und in eclipse importiert, welches ich stückweise abarbeite. jedoch wird die datenbank nicht im ddms -> file expl. -> data -> data angezeigt bzw. werden zudem auch nicht die projekt folder gelistet.


    was müsste ich tun oder wo liegt der fehler?


    Hier ein screenshot:

    HTML
    http://s7.directupload.net/file/d/3482/qk6r4idt_jpg.htm
  • Zunächst einmal würde deine DB auch nicht unter data/data liegen, dort liegt nämlich der Ordner deiner App (bei Demos meist was in der Art "com.example.*", und erst in diesem Verzeichnis findest du die Daten deiner App.


    Dann ist noch zu beachten, das der Zugriff auf diese Ordner aus Sicherheitsgründen beschränkt ist, d.h. man kann die Dateien nur sehen, wenn man über entsprechende Rechte verfügt.
    Ob der DDMS-"User" über solche verfügt, weiß ich gerade nicht auswendig (mangels Bedarf), in der adb Doku meine ich aber gelesen zu haben, das die notwendigen Berechtigungen erlangt werden können.


    Die eigentlich Frage aber ist: warum willst du da überhaupt gucken?
    Läuft die App nicht? Willst du in die DB hineinschauen?


    Die DBs meiner eignen Apps sind meist recht groß (bis zu 1.3 GB), daher lege ich die grundsätzlich nicht im App Verzeichnis ab, sondern in der vorgeschriebenen Struktur auf dem externen Speicher; wenn du also in deine DB hineinschauen, sie am PC ergänzen oder jederzeit einfach austauschen können willst, dann würde ich dir diese Vorgehensweise empfehlen.

  • Hallo and.dev,


    erstmal danke für deine antwort. Das mit den berechtigungen habe ich jetzt nicht gewusst (gut zu wissen).


    Nun wie gesagt, arbeite ich mich gerade in sqlite ein und wollte halt nur nach den tutorials und bücher halten. Da wurde es auch gezeigt und wollte es dementsprechend auch hineinschauen, ob und wie die db angelegt wird. So wichtig ist das eigentlich nicht.


    Und ja die App läuft leider nicht, so wie ich es mir vorstelle. :-[ :-/
    Am anfang habe ich mit hashmaps gearbeitet, die ich dann in eine arraylist reingepackt habe und diese durch einen simpleAdapter auslesen wollte (die werte aus den spalten sind für ein custom listview gedacht). komischerweise wurden die anders zugeordnet, als ich die app ausgeführt habe. Habe dann in der log die zeilen ausgeben lassen und auch da waren die voll durcheinander. ?(


    Ich habe jetzt vieles geändert und bin mir sicher das ich es fast geschafft habe. jedoch bekomme ich mysteriöserweise eine nullpointerException.

  • Zitat

    Habe dann in der log die zeilen ausgeben lassen und auch da waren die voll durcheinander.

    Damit haben wir ja schon mal als Fakt, das die DB existiert und Daten enthält ;)


    Zum "Durcheinander" kann ich jetzt natürlich nichts sagen, solange ich keinen Code gesehen habe.
    Wichtig vielleicht: die "Zeilen" einer DB-Tabelle haben keine (definierte) Ordnung, wenn deine Abfrage also kein "order by" enthält, dann kommen die Zeilen nicht zwangsläufig in der Reihenfolge heraus, in der du die eingefügt hast.
    Meinst du das vielleicht mit "durcheinander"?



    Zitat

    jedoch bekomme ich mysteriöserweise eine nullpointerException.

    Da du ja schon weißt wie man das Logcat liest, sollte sich die Ursache ja leicht finden und beheben lassen, oder?

  • Nee, ich denke schon das ich die werte in die richtigen spalten zugewiesen habe. Ich denke eher das der fehler beim auslesen der daten aus dem Arraylist<hashmap> lag. Bin mir auch nicht sicher und ehrlich gesagt wurde es mir zu kompliziert (obwohl das eigentlich ja nicht so schwer ist) und war am ende nur noch durcheinander. Jetzt mache ich es ohne irgendwelche Arraylist<hashmap>.
    Zum Fehler:
    Finden aus dem logcat ist nicht das problem, aber warum die angegebene zeile aus dem logcat ein fehler ist, das ist ja der knackpunkt, weil ich der meinung bin das ich alles richtig gemacht habe und komme einfach nicht auf die lösung.


    Ich poste das mal kurz wenn es ok ist:


    Mein MainActivity:


    Fragment Schuldner


    und die DataBaseHandler KLasse:


    die logcat:



    dort steht "attempt to re-open an already-closed.. ", was ich auch nicht verstehe. wenn die app abstürtzt oder normal beendet wird, wird die db geschlossen. beim ausführen der app sollte die db sich im geöffneten zustand wieder befinden. Verwirrung pur! ?(

  • Zitat

    Ich poste das mal kurz wenn es ok ist:

    Natürlich, anderenfalls würde man dir hier nicht helfen können, schätze ich ;)
    Guckmal:

    Zitat

    Cursor cursor = db.rawQuery(countQuery, null);
    cursor.close();
    return cursor.getCount();

    (hab die auskommentierten Zeilen zwischendrin entfernt, damit du es besser sehen kannst)
    Du schließt den Cursor und fragst ihn anschließend nach getCount() - das war nicht dein Plan, oder? :P

  • Zitat

    Natürlich, anderenfalls würde man dir hier nicht helfen können, schätze ich ;)

    danke :)


    Zitat

    Du schließt den Cursor und fragst ihn anschließend nach getCount() - das war nicht dein Plan, oder?

    Also ich habe es auch so versucht

    Code
    ...
        	int count = cursor.getCount();
        	cursor.close();
        	db.close();
       	return count;


    auch so bekomme ich den gleichen fehler. Aber das habe ich nur zum testen gemacht, weil mein eigentlicher fehler was anderes war.
    eigentlich wollte ich, dass wenn ich die App starte, die werte aus der db in die listview eingesetzt werden (das war mein ziel). Sry habe es vergessen mitzuteilen. :-[


    in der klasse Mainactivity -> openDB() wird ja ein objekt der klasse DataBaseHandler erstellt und geöffnet. Danach wird die methode populateListViewFromDB() der Klasse Schuldner ausgeführt, welche die einträge aus der db in die listview eintragen soll. Da habe ich nun (dank dir) bemerkt, dass ich in dieser populateListViewFromDB() methode einen cursor anlege und dann in der mainactivity.cursorManaging() methode gleich noch einen weiteren cursor anlege (das ist doch doppelt gemoppelt oder nicht!?).


    ich habe das es nun so geändert:


    und in der MainActivity:


    Code
    ....
    public void cursorManaging() {
    	    startManagingCursor(fr_schuldner.cursor = myDBHandler.getAllRows());
    	}


    Jetzt bekomme ich nämlich den Fehler, was ich eigentlich von anfang an bekommen hatte.



    In der Zeile 109 steht: cursor = mainActivity.myDBHandler.getAllRows();


    Ich dachte am Anfang das die DB leer ist bzw. das generell kein zugriff auf die db erfolgt oder so (keine ahnung). Daher wollte ich mit dem getCount checken, ob meine vermutungen richtig waren. hmm....

  • Zitat

    auch so bekomme ich den gleichen fehler.

    Der Code sieht aber korrekt aus, also muss da dann etwas anderes im argen liegen, wenn du so wirklich den gleichen Fehler bekommst.
    Aber da das nur Textcode war, können wir das ja erstmal vernachlässigen.


    Zitat

    dass ich in dieser populateListViewFromDB() methode einen cursor anlege und dann in der mainactivity.cursorManaging() methode gleich noch einen weiteren cursor anlege (das ist doch doppelt gemoppelt oder nicht!?).

    Natürlich, und je nachdem wie der Code weitergeht, wird er so halt auch nicht funktionieren.
    Die Extrafunktion hast du erstellt, damit du nur ein zentrales deprecated bekommst?


    Zitat

    In der Zeile 109 steht: cursor = mainActivity.myDBHandler.getAllRows();

    ...und diesmal ist es ein nullpointer und kein illegal state ;)
    OK:
    - getAllRows kann natürlich null zurückgeben, etwa wenn die Abfrage nicht korrekt ist oder sonst ein Fehler auftritt; nachdem du laut Code in der unmittelbar folgenden Zeile nichts mit dem Cursor machst, ist das nicht das Problem
    - demnach wird entweder myDBHandler oder mainActivity null sein; ob das casten von getActivity() auf eine bestimmte Klasse so Java-Like ist, weiss ich ja jetzt nicht... ich verwende für meine Datenbank-Helper eine Klasse mit statischen Members, da ergibt sich diese Problematik gar nicht.


    Ich würde jetzt wahlweise einen Breakpoint an die Stelle setzen oder ein paar Log Ausgaben einstreuen, wenn ich mit Lesen des Codes nicht weiter kommen würde.

  • Zitat

    Die Extrafunktion hast du erstellt, damit du nur ein zentrales deprecated bekommst?

    Das habe ich nicht verstanden. Was genau meinst du?

    Zitat

    demnach wird entweder myDBHandler oder mainActivity null sein; ob das
    casten von getActivity() auf eine bestimmte Klasse so Java-Like ist,
    weiss ich ja jetzt nicht...

    Ja ich vermutete auch, dass myDBHandler oder mainActivity null ist. um das zu prüfen habe ich folgendes gemacht. im nachhinein in die Klasse Schuldner eine MainActivity Referenz initialisiert, damit z.b auf die methoden der mainActivity zugegriffen werden kann um keine nullpointerExcept. zu bekommen.

    Code
    @Override
    	public void onAttach(Activity activity) {
    		super.onAttach(activity);
    		 try {
    	        	mainActivity = (MainActivity) activity;
    	    	} catch (ClassCastException e) {
    	        	throw new ClassCastException(activity.toString() + "Fehler: Keine MainActvity-Instanz!");
    	    	}
    	}


    habe dann in der MainActivity eine Methode erstellt, welches einen einfachen String-wert zurückgibt.

    Code
    public String test() {
    		testString = "Test!";
    		return testString;
    	}


    In der Klasse Schuldner die Zeile 109 auskommentiert und eine zeile danach in Zeile 110
    Log.e("***TEST***", "" + mainActivity.test()); eingegeben um zu testen ob es halt an der MainActivity liegt.


    Ergebnis: die gleiche nullpointerException-Fehlermeldung in zeile 110. Also kann man davon ausgehen das mainActivity null ist.


    Aber wie kann das sein??? Ich habe ja in der onAttach() Methode eine MainActivity Referenz initialisiert. EIgentlich müsste mainactivity gar nicht null sein. verstehe das nicht... :-/

    Zitat

    Ich verwende für meine Datenbank-Helper eine Klasse mit statischen Members, da ergibt sich diese Problematik gar nicht.

    Kannste ein biespiel geben? O:-)

  • Zitat

    Das habe ich nicht verstanden. Was genau meinst du?

    Du hättest auch direkt "getActivity().startManagingCursor(cursor);" verwenden können, dann gibts aber an jeder betreffenden Stelle eine Warnung, das startManagingCursor() deprecated ist.
    Mit der Extrafunktion cursorManaging() reduzierst du die Warnungen im Code auf eine zentrale Stelle.



    Zitat

    Also kann man davon ausgehen das mainActivity null ist.

    Gut, dann ist das ja auch geklärt :)

    Zitat

    Aber wie kann das sein??? Ich habe ja in der onAttach() Methode eine MainActivity Referenz initialisiert.

    Dann wird deine populate... Funktion entweder vor dem onAttach() ausgeführt, oder getActvity() liefert null (was ich im onAttach Context allerdings für nicht sehr wahrscheinlich halte) ;)


    Vielleicht verlegst du die letzten beiden Zeilen deines onCreate() mal in onResume(), da sind die ohnehin besser aufgehoben und vielleicht löst das dein attach Problem gleich mit.

    Zitat

    Kannste ein biespiel geben?

    Was ist unklar?


    public class DB {
    ...


    public static boolean open(String filename) {
    ...
    }
    public static void close() {
    }
    ...
    }


    Im Code kann ich dann an jeder Stelle "DB.open(path)" etc. verwenden, ohne zuerst herleiten zu müssen, das eine bestimmte Activity einen bestimmten Member bereits initialisiert hat o.ä.

  • Zitat

    Dann wird deine populate... Funktion entweder vor dem onAttach() ausgeführt

    Ich denke eher das es daran liegt. Leider fällt mir nichts mehr ein was ich dagegen noch tun kann. Hab es auch schon mit interfaces versucht. Nun es kann sein, dass ich etwas kompliziert die sache angege und dass meine vorgehensweise nicht so praktisch und vom codestyle her nicht so effizient und gut ist. Wie könnte man denn sonst vorgehen, dass wenn die app startet die listview automatisch gefüllt und angezeigt wird!? In anbetracht mit fragments natürlich.

  • ok, das prolbem mit dem nullpointer ist vorübergehend weg. (puhh.... man man)


    habe die populate methode in die onResume methode des fragments SChuldner gepackt und in der methode folgendes geändert:


    getActivity().startManagingCursor(cursor = mainActivity.myDBHandler.getAllRows());


    Zumindestens stürzt die app nicht ab und wird normal ausgefürht. da ich momentan noch keine einträge in der db habe werde ich diese erstmal füllen müssen, ob die listview dann auch dementsprechend mit den werten geladen wird.


    Danke and.dev für die Hilfsbereitschaft ;)

  • Zitat

    habe die populate methode in die onResume methode des fragments SChuldner gepackt

    Weise Entscheidung ;)
    Ich hoffe du weißt auch, warum du das gemacht hast (hast es also nicht nur gemacht, weil ich es vorgeschlagen habe) :)


    Zitat

    getActivity().startManagingCursor(cursor = mainActivity.myDBHandler.getAllRows());

    Genau, denn du brauchst den gemanaged'ten Cursor ja noch beim Aufrufer, für den CursorAdapter der ListView.

    Zitat

    Zumindestens stürzt die app nicht ab und wird normal ausgefürht. da ich momentan noch keine einträge in der db habe werde ich diese erstmal füllen müssen, ob die listview dann auch dementsprechend mit den werten geladen wird.

    Den Dialog dazu hattest du doch bereits erstellt, oder habe ich das falsch gesehen?

    Zitat

    Danke and.dev für die Hilfsbereitschaft

    Gerne, ich hoffe es war lehrreich :)

  • Zitat

    Ich hoffe du weißt auch, warum du das gemacht hast (hast es also nicht nur gemacht, weil ich es vorgeschlagen habe) :)

    Ne ne, nicht weil du vorgeschlagen hast. hab es verstanden. ehlich gesagt frage ich mich jetzt, wie ich diesen fehler überhaupt machen konnte!? ?(

    Zitat

    Den Dialog dazu hattest du doch bereits erstellt, oder habe ich das falsch gesehen?

    Jup, habe ich ;)

  • Zitat

    Ne ne, nicht weil du vorgeschlagen hast. hab es verstanden.

    Sehr schön :)


    Zitat

    ehlich gesagt frage ich mich jetzt, wie ich diesen fehler überhaupt machen konnte!?

    Sei mal nicht zu streng mit dir, hab ich beim ersten mal auch falsch gemacht ;)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!