Beiträge von UweApps

    Mit dem GPS-Empfang ist das so eine Sache - die Zeit ist kein wirklich gutes Kriterium für eine gute Positionsbestimmung.


    Besser ist es, einen Service für GPS-Empfang zu starten, der in mehr oder weniger regelmäßigen Abständen Mitteilungen vom GPS-Empfänger bekommt und sich aus den Daten "das beste" raussucht.


    Wenn der Benutzer dann einige Aktionen macht, vergeht einige Zeit und dann irgendwann (z.B. bei onPause der Activity) kannst du dann eine recht gute Position von deinem Service abfragen. Dann kannst du den Service auch stoppen, damit er nicht später irgendwelche unerwarteten Fehlermeldungen von sich gibt...


    Was aber eine "gute Position" ist, kannst du auch aus den Positionsdaten entnehmen, in einem Positions-Datensatz ist auch eine Angabe zur Genauigkeit.


    Die Android-Doku hat zum Thema Positionsbestimmung auch einen längeren Artikel, je nach Anwendung sind unterschiedliche Strategien sinnvoll.

    Das ist ja eine wirklich hilfreiche Zusatzinformation - ich war nämlich erschlagen von den vielen Klassen! ?(


    Du hast gamedatasource zwar irgendwo mal initialisiert, aber in den anderen Klassen leider jeweils wieder lokal ein gamedatasource angelegt und nicht initialisiert.


    Wahrscheinlich solltest du dafür auch mal gamedatasource = new GameDataSource(this); aufrufen, oder vielleicht einen Service dafür einsetzen oder auf eine public-Variable einer anderen Klasse zugreifen...

    Mach doch mal einen Doppelklick auf der Fehlermeldung, die im Log auf deinen Code hinweist - dann findest du die Variable, die nicht initialisiert wurde.


    In den Fehlermeldungen stehen auch immer Zeilennummern... ;)

    was denn für einen Fehler??


    Aber es ist schon richtig, dass du den Dialog im onPrepareDialog anpassen musst, der wird nämlich jedesmal aufgerufen - der onCreateDialog nur einmal.


    Du kannst dir mit Log.v("meineActivity","Dialog erzeugt") bzw ..."Dialog vorbereitet"... anzeigen lassen, wann die beiden Methoden aufgerufen werden.

    Ja, du hast nur leider nur den Builder neu gemacht aber nicht den Dialog:


    Java
    protected void onPrepareDialog(int id, Dialog dialog) {		
    		CharSequence text = this.getResources().getString(R.string.berechnentext, ergebnis);
    		
    		builder.setMessage(text);
    
    
    		dialog = builder.create();
    	}

    Du kannst in Eclipse in den Quelltexten suchen mit STRG-F mit dem Suchstring \bList\b und der Option Regular expressions - und dort überall ArrayList eintragen.


    Oder du machst einen cast in der putExtra - das ist aber nicht die schöne Methode:

    Java
    myIntent.putExtra("PlayerList", (ArrayList<Entry>) PlayerList );

    Stimmt - List ist auch nicht Serializable - aber ArrayList ist es schon.


    Und weil du eigentlich sowieso eine ArrayList verwendest, kannst du das doch auch gleich so definieren. Du musst es aber an mehreren Stellen ändern...

    Die Daten im Emulator kannst du zurücksetzen, wenn du entweder die App über die Settings deinstallierst oder du machst einfach eine neue Datenbankversion, dann wird ja die alte Tabelle gelöscht (wenn du den richtigen Tablename im DELETE TABLE eingetragen hast!!!) und neu angelegt.


    Du kannst eigene Datenklassen auch für Intents verpacken, wenn sie Serializable implementieren - das geht meistens ohne größeren Aufwand, wenn die lokalen Variablen alle serializable oder Basis-Typen sind. Dann funktioniert auch intent.putExtra(). Dazu gibt's dann intent.getSerializableExtra().

    Versuch doch mal, dein Layout mit LinearLayout statt RelativeLayout zu bauen - die LinearLayout kann man auch verschachteln und mit android:orientation="horizontal" ausrichten.


    Und mit android:layout_weight="1" kannst du deinem Haupt-Element so viel Platz geben, wie der Bildschirm hergibt - der Rest sollte sich dann am unteren Ende des Bildschirms tummeln.

    Dass du da was eingegeben hat, glaub ich dir gerne, aber hast du das auch aus dem Eingabefeld in eine Variable übernommen???


    Ich hab mich noch mal durch die ganzen Codebeiträge durchgewühlt und auch was gefunden: SaveClick holt zwar alle View-Elemente und prüft, ob überall was eingegeben ist (ist aber nicht so schön programmiert, oder was meinst du...).


    Aber in SaveClick werden die Eingaben der Felder nicht in die Variablen name, lastname etc. übernommen:

    Java
    name = editname.getEditableText().toString>();
    ...


    Es funktioniert zwar auch mit getText(), aber getEditableText() ist die bessere Methode bei EditText-Feldern...

    naja - dann werden name und lastname wohl leer sein, denke ich mal.


    Ich hab deine Klasse Entries im Visier, die hab ich aber hier noch nicht gesehen.


    Aber du lädst die Daten vom Cursor mit entry.setName() etc. - gibt es auch entry.getName()??? Das könnte dir helfen...


    Oder sind tatsächlich keine Daten gespeichert worden - das kannst du im createEntryPlayer() ja mal mit einem kleinen Log.v() rausfinden...
    Vielleicht hast du die Daten ja gar nicht aus den Eingabefeldern ausgelesen. O:-)

    Wieso findet der denn eine String-Resource nicht? Hmm. Mach doch noch mal Project - Clean...


    Aber die Daten sind schon mal da und 21 Datensätze sind ja auch schon mal was.


    Die komische Ausgabe passiert, weil du ein Objekt ausgibst und nicht den Inhalt des Objekts. Allerdings weiß ich nicht, warum das ein manager.scg ist...


    Aber im Adapter musst du was ändern: da schreibst du Team.this - schreibe stattdessen mal PlayerList - denn die Daten willst du ja ausgeben, oder?? ;)

    Du kannst z.B. den addplayer.setOnClickListener erweitern und dort bevor du den Intent startest.


    Aber ich hab noch eine bessere Idee: eigentlich sollte da ja was in ListTeam passieren - bau doch dort mal ein oder zwei Log-Ausgaben rein und lass dir PlayerList.size() anzeigen - dann weißt du, wie viele Datensätze gespeichert sind.
    Dann kannst du mal die Log-Ausgabe anpassen und mal einzelne Daten ausgeben - nur mal zum testen...


    Wenn da was drin sein sollte, dann müßte dein ListView das ja hoffentlich auch anzeigen.


    Und schau noch mal nach, wo das ListTeam aufgerufen wird - da hab ich nämlich nichts gefunden - im onCreate könntest du das eintragen.

    Stimmt - du solltest die Ausgabemeldung noch mal etwas erweitern, dann weißt du mehr:


    Java
    if (cursor.getCount() == 0) {
    	Log.w("PlayerDataSource.createEntryPlayer()","keine Daten gefunden, ID=" + insertId);
    	return null;
    } else {
    	Log.v("PlayerDataSource.createEntryPlayer()","Daten gefunden, ID=" + insertId);
    }


    Nun solltest du auf jeden Fall eine Meldung bekommen - und endlich mal die kleinen Zahlen sehen, auf die wir schon so lange warten. ;)


    Ich hab den Code immer noch nicht in ein eigenes Projekt eingebaut, darum stochere ich etwas rum - aber du lernst vielleicht auch was dabei.


    Der nächste Schritt wäre dann ein Schritt, den wir schon hatten: mach dir mal einen onClickListener auf ein View-Element und versuche dort, den Datensatz auszulesen. Wenn du genug Log-Meldungen im Code verteilt hast, dann solltest du was sehen...

    Du musst natürlich auch in deinen Abfragen das "ID" ersetzen durch "_id" - die Spalte ID gibt es ja nicht mehr. Aber das hast du ja wohl schon gelöst.


    Nun meckert er wegen der Abfrage - da muss doch in den Log-Ausgaben eine Zeile drin sein, die sich auf deine App bezieht und da steht eine Zeilennummer.
    Wenn du dort doppelt klickst, dann kommst du an die Zeile, wo das Problem liegt.


    Aber ich glaub, ich weiß schon wo das Problem liegt: du hast in der Definition von allColoumns das Feld "_id" vergessen!!! :P


    Und wenn du dann auf den Cursor zugreifst, gibt es keine 5. Spalte...


    Diesmal drück ich keine Daumen - die sind schon ganz rot... *lol*

    OK - also bei -1 kommt garantiert auch kein Datensatz raus, denn die ID sollte eigentlich nicht erscheinen.


    Einen Fehler hab ich gefunden, bitte entscheide dich, ob du MAIL oder EMAIL als Feldname verwendest. ;)


    Aber daran kann es eigentlich nicht liegen, denn er sollte dir trotzdem den Datensatz speichern - denke ich mal.


    Schauen wir uns mal das create table an.
    Die SQLiteDB-Doku empfiehlt folgende Feldtypen: TEXT, NUMERIC, INTEGER, REAL, NONE - kannst du bitte in deinem create-Statement die Typen in Großbuchstaben schreiben und INTEGER statt int (obwohl es eigentlich auch so funktionieren sollte, aber versuchen kann man es ja mal).


    Außerdem empfehle ich noch mal dringend, _id als Feldname zu verwenden, auch Android empfiehlt das und es gibt sogar die Konstante BaseColumns._ID (mit dem Inhalt "_id") um die Bedeutung mal klar hervorzuheben...


    Auch das CREATE TABLE und PRIMARY KEY AUTOINCREMENT darf gerne in Großbuchstaben.


    Und dann noch mal die Datenbankversion hochsetzen und genau schauen, ob es bei der Warnmeldung zum DB-Upgrade noch irgendwelche anderen Meldungen von der Datenbank gibt.


    Ich drücke weiter die Daumen!!!

    Kannst du mal "Project" - "Clean..." auf deinem Projekt machen?


    Oder ändere mal die Manifest-Datei. Kannst ja mal die Versionsnummer hochsetzen, ist ja auch 'ne neue Funktionalität drin. ;)


    Wahrscheinlich haben sich durch den eingefügten Sound die IDs verändert und da verheddert sich das SDK manchmal und arbeitet mit teils veralteten IDs weiter...

    OK, dann fällt mir noch was anderes ein: du speicherst und lädst gleich nacheinander - vielleicht hat Android da im Hintergrund aber noch nicht alles wirklich gespeichert.


    Kannst du die Warnmeldung noch mal etwas erweitern, dann wissen wir wenigstens, ob gespeichert wurde oder nicht:

    Java
    Log.w("PlayerDataSource.createEntryPlayer()","keine Daten gefunden, ID=" + insertId);


    Wenn dort -1 steht, ist nichts gespeichert worden, dann muss irgendwas mit der Datenbank falsch sein.


    Aber ich hoffe mal, dass du eine kleine Zahl angezeigt bekommst, dann wurde nämlich gespeichert, aber die Daten sind noch nicht wieder zum Lesen bereit.
    In diesem Fall empfehle ich dir, die Daten nicht gleich nach dem Speichern wieder zu laden.
    Versuch das doch mal mit 'nem OnClickListener auf irgendeinem View-Element.


    *däumchendrück*