Beiträge von UweApps

    Die Zeile mit dem setViewBinder() kommt nach deinen Zeilen mit new SimpleCursorAdapter = new SimpleCursorAdapter(....); - sonst würdest du eine NullPointerException um die Ohren gehauen bekommen, weil conAdapter ja noch nicht definiert ist.


    Und die Definition vom viewBinder ist eine Variable, die in der Klasse definiert wird - die kommt z.B. hinter deiner onCreate(...){...} - hinter die geschweifte Klammer und auf jeden Fall vor der allerletzten } am Dateiende.


    Hatte schon vermutet, dass du noch etwas neu mit Java bist, darum der Code, damit du weiterkommst. ;)


    Und wahrscheinlich musst du bei dir R.id.TextView statt R.id.item_TextView eintragen - wenn ich deinen Code-Ausschnitt richtig verstanden hab. Aber das steht bei dir ja hoffentlich als android:id="@+id/TextView" in der datensatz_list.xml.


    Ich würde die Datei ja lieber datensatz_list_item.xml nennen, dann weiß man gleich, dass die für einen einzelnen Eintrag und nicht für die ganze Liste ist. Darum auch meine Umbenennung auf item_TextView - liest sich besser, finde ich. :*

    Du wirst wohl deinem SimpleCursorAdapter einen ViewBinder spendieren müssen. Da drin kannst du dann den View weiter bearbeiten und u.a. Icons zum TextView vergeben.


    Java
    conAdapter.setViewBinder(viewBinder);


    Der ViewBinder könnte so ähnlich ausehen:



    Oder suchst du was ganz anderes??

    Hast du im äußeren LinearLayout auch android:orientation="vertical" angegeben, damit die Inhalte untereinder stehen?


    Der Default ist nämlich horizontal...


    Ansonsten schau doch mal im Eclipse unter "Help" - "Check for Updates" sowie auch unter "Window" - "Android SDK Manager" nach, ob du alle Updates geladen hast, denn gerade die Syntax-Prüfungen für XML sind in der letzten Zeit viel strenger geworden.

    hmm - mich wundert, dass deine Entwicklungsumgebung die XML-Datei überhaupt akzeptiert... :-[


    Bei mir wurde einiges angemeckert: zunächst mal vertical statt vertikal.


    Dann protestiert mein Eclipse wegen der unklaren Verhältnisse bei 0dp - ich hab mal 10dp statt 0dp eingetragen.


    Und der Parameter layout_above ist ungültig, weil drumherum ein LinearLayout und kein RelativeLayout ist.


    Und dann ist wrap_content ja auch bei leeren LinearLayout verschwindend klein, das heißt ohne Inhalt sieht man nix. Hab darum mal match_parent eingesetzt (ist der neue Name für fill_parent).


    Hier mal mein Gegenvorschlag:

    Interessant wären auch die anderen Parameter in deinem Layout - bei match_parent wird der aktuelle View allen Platz verbrauchen, egal ob noch weight definert ist.


    Ich setze meistens folgendes;

    Code
    android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"


    Hierbei wird das 0dp durch layout_weight aufgebläht, wenn möglich.


    Aber dann können auch noch die Inhalte der beiden Teile dazwischenfunken - du wirst wahrscheinlich viel rumprobieren müssen und am Ende doch bei einer festen Höhe für den ersten oder zweiten Teil enden...


    Diese feste Höhe kann aber ausgelagert werden in eine dimens.xml - diese Datei kann dann für xlarge und small angepaßt werden ohne am Layout was zu ändern.

    Ich mach immer im Projekt rechts klick - New - Class - dann den Namen eintragen und für die Superklasse auf den Browse-Button klicken und Activity als Suchwort eingeben und in der Liste anklicken.


    Dann hab ich eine neue Klasse und kann dort mit der onCreate()-Methode anfangen.


    Auf dem Weg kann ich auch andere Superklassen auswählen. Man kann die Superklasse aber auch auf Objekt lassen und später einfach mit extends eintragen. Siehst du aber auch in allen Beispielen.

    Prüfe doch mal, ob du in der Variable marke überhaupt was drin hast - sonst wird im String nämlich '%null%' eingebaut und das gibt bei Autos keine Treffer.


    Java
    Log.e("MyActivity", "Marke: " + marke);


    Die Spalte MARKE in deiner TABLE_CAR ist hoffentlich String und hat die Markennamen - dann solltest du für die Abfrage MARKE + "='" + marke + "'" benutzen..


    Groß/Kleinschreibung sollte keinen Unterschied machen ("Audi" vs. "audi") - glaub ich...

    Hast du auf dem Server ein phpmyadmin laufen? Bei vielen Providern ist das mit eingebaut.


    Damit kannst du Dumps in Form von SQL-Statements erstellen, die aber voraussichtlich ein paar Besonderheiten von MySQL enthalten - das sollte aber mit Suche/Ersetzen zu ändern sein.


    Die Dumps kannst du dann mit einer kleinen Routine in deiner App einlesen und an die SQLite abfeuern. Mach daber aber erst mal ein paar Testläufe und prüfe ob die Daten richtig drin sind.

    Wo baust du deinen View im Fragment auf?


    Ich nutzte dafür die onCreateView() - die wird öfter mal aufgerufen als die onCreate().


    Ansonsten probiere doch mal folgendes:


    Neues Android Application Projekt anlegen (minApi 11) und MasterDetailFlow als Basis-Klassenstruktur auswählen - da hast du dann erst mal alles für eine ListActivity mit Fragments.


    Dort sind nur wenige Abhängigkeiten für API 11 drin, einfach die minApi runtersetzen und gucken, wo was schiefgeht.


    Speziell das Laden des ListFragment ist da ein Problem (activity_item_layout.xml), aber da willst du bestimmt ein eigenes Fragment einsetzen.


    Die support lib ist netterweise schon drin...

    Bist du sicher, dass du von dem Aufrufer die URI im getData() bekommen sollst?


    Vielleicht liegt da auch was in den getIntent().getExtras() - dort kannst du mit .keySet() nachschauen, welche Schlüssel im Bundle sind. Eventuell ist dort was dabei.

    Hallo kaetzchenfg,


    das ist ja das Ziel der Übung: eine Activity mit ListView und eine Activity mit Daten-View.


    Vielleicht liegt dein Problem an folgender Stelle:


    Die Daten-Ansicht hat eine layout.xml-Datei - dort hast du wahrscheinlich die Strings eingetragen, die angezeigt werden sollen. Das brauchst du aber nicht - die Einträge müssen nämlich noch auf die aktuellen Werte gesetzt werden.


    In der layout.xml müssen aber die android:id gesetzt werden, damit du im Code auf die Elemente zugreifen kannst.


    In der DatenAnsichtActivity bekommst du mit dem Code, den killphil angegeben hat, die Daten des aktuellen Datensatzes.


    Diese müssen dann in den View eingefüllt werden:

    Java
    TextView meinTextView1 = (TextView) findViewById(R.id.view_id);
    meinTextView1.setText(id);
    TextView meinTextView2 = (TextView) findViewById(R.id.view_name);
    meinTextView2.setText(name);
    TextView meinTextView3 = (TextView) findViewById(R.id.view_katzentext);
    meinTextView3.setText(katzentext);


    Dann kann ich noch aus der Android-Doku den Text Starting Another Activity empfehlen - der Link führt dich gleich auf den Teil Receive Intent. Aber davor gibt's bestimmt auch noch interessante Abschnitte. B-)


    Und zu deiner Sorge mit Resourcenverbrauch: die DatenAnsichtActivity wird zwar immer wieder neu gestartet und muss die Eingaben abarbeiten, aber genau dafür sind die Activities auch gebaut. Keine Sorge, die alte DatenAnsichtActivity wird bei Gelegenheit aus dem Speicher gelöscht. Das siehst du, wenn du mit einem Emulator deine App ablaufen läßt und im LogCat die Meldungen anschaust - dauernd wird mal wieder Speicher freigegeben.


    Viel Erfolg
    UweApps

    Hallo schymura,


    die Version deiner Datenstruktur würde ich als Versionsnummer einfach im App-Code speichern und als Parameter an das PHP-Script übergeben - dann muss dein PHP-Script nicht erst eine Liste von App-Versions-Nummern oder -Codes abklappern.


    Abfrage über HTTPS sollte die Übertragung deiner Daten dann auch unlesbar auf dem Übertragungsweg machen - das sichert aber noch nicht die Abfrage der Daten von etwas anderem als deiner App.


    Wenn du ganz sicher gehen willst, wie wäre es mit diesem Ablauf:

    • App fragt PHP nach Zugangscode und erhält einen Zufalls-String (diesem auf dem Server kurzzeitig speichern)
    • App verschlüsselt diesen String und sendet diesen mit den anderen Anfrageparametern zurück
    • PHP entschlüsselt diesen wieder und bei Übereinstimmung werden die Daten ausgeliefert

    Klingt vielleicht etwas aufwändig, aber dadurch ist sichergestellt, dass kein fester Zugangscode für das PHP-Script existiert.


    Viele Grüße
    Uwe

    Je nach Gerät ist die interne Speicherkarte nochmal in einzelne Partitionen aufgeteilt, so dass für den Systembereich nicht allzu viel Speicher zur Verfügung steht.


    Aber wenn du das Ding nicht mit zu großen Apps vollgepflastert hast (Einstellungen - Apps/Anwendungen zeigt dir die Größen), dann könnte auch in anderen Verzeichnissen viel gespeichert sein. Einige Apps speichern irgendwelche Log-Daten bis die SD-Karte voll ist...


    Aber wenn die App abstürzt, ist sie ja schon mal auf der SD-Karte gespeichert - dann sollte der Fehler woanders liegen. Du kannst ja mal die App von Eclipse aus auf dem Handy starten (evtl. vorher deinstallieren) und dann schauen, was für eine Absturzmeldung kommt. Die hilft dir (und uns) dann eher weiter...

    na gut - dann schreib ich doch mal meinen Senf dazu...


    Bei einer Datenbank mit mehreren Millionen Datensätzen - jeweils z.B. 100 Byte - bist du schnell mal bei mehreren 100MB Volumen mit dem du rumwerkelst. Das Hauptproblem wird sein, die Daten alle irgendwie auf das Gerät zu bringen - in einer App bist du beschränkt mit der Größe der APK-Datei und auch die Zusatzpakete muss sich ein Anwender alle runterladen.


    Sinnvoller ist dein Vorschlag, die Daten erst bei Bedarf zu laden - bereits geladene Daten kannst du ja speichern, aber du solltest immer mal prüfen, ob noch genug Speicher frei ist. In der aktuellen c't ist ein Artikel zum Speicher in Android. B-)


    Die SQLite-DB ist erst mal nicht wirklich beschränkt in der Menge - die Grenzen sind m.W. noch weit von deinen Anforderungen entfernt. Aber die Zugriffszeiten könnten miserabel werden, da die SQLite dann doch nicht so gut optimiert wie größere Datenbanken.


    Und wenn du von Adressdaten schreibst, dann will ich noch mal das "Datenschutzgesetz" in den Raum schmeißen - kommt halt drauf an, ob da was schützenswertes in den Adressen ist...

    Offensichtlich findet die Abfrage kein Ergebnis, der Cursor ist leer:

    Zitat

    Index 0 requested, with a size of 0


    Ich verarbeite meine Datenbankabfragen meistens in einer while-Schleife (bei "limit 1" reicht auch if...):

    Java
    Cursor cur = context.getContentResolver().query(uriSMSURI, null, null, null, "_id DESC limit 1");
    String protocol = null;
    while (cur.moveToNext()) {
    	protocol = cur.getString(cur.getColumnIndex("protocol"));
    	// weitere Bearbeitung
    }


    Wenn nix im Cursor ist, wird auch nix gemacht, ansonsten werden alle Ergebnins-Einträge abgearbeitet. B-)

    Die Daten kannst du auch in XML speichern, aber das ist eigentlich nur sinnvoll, wenn man die Daten mit anderen Programmen austauschen möchte. Außerdem wird das erst mit dem javax.xml.transform.Transformer einfach, der ist aber erst ab API 8 verfügbar, deine App läuft dann nicht auf älteren Smartphones. :(


    Du schreibst "aktuellen Stand abspeichern" und "einen gespeicherten Datensatz weiter verwenden, einen neuen erstellen oder den letzten benutzen".


    Dein Stichwort Datensatz deutet stark auf SQLiteDB hin - da kannst du dann viele Datensätze speichern, es gibt auch viele Beispiele in den Developer-Dokus auch zum Auswählen aus einer Liste. Besonders wenn immer die gleichen Felder im Datensatz sind, solltest du eine Datenbank nehmen.


    Und in den SharedPreferences kannst du den aktuellen Stand speichern - die letzte benutzte id sollte genügen, wenn du die Daten in der Datenbank hast.

    Da hast du wahrscheinlich eine Variable für deine Methode WebsiteReader.readWebsiteContent nicht richtig initialisiert. Kurz danach fliegt dir nämlich 'ne NullPointerExeption um die Ohren.


    Am besten setzt du vor der Zeile 73 ein paar kleine Zeilen in der folgenden Form rein, dann weißt du wenigstens, wer gerade null ist:

    Java
    if (variable == null) {
        Log.e("WebsiteReader", "variable ist leider null...");
    }


    Anschließend musst du mal gucken, wo du die Initialisierung vergessen hast...