MySql Datenbank in eine ListView auslesen!

  • Antworten:53
L3322
  • Forum-Beiträge: 467

28.11.2010, 14:09:09 via Website

So heute wage ich mich mal an mein erstes Tutorial.
Ich habe selber, als ich mich mit diesem Thema auseinandergesetzt habe, keinen derartigen Artikel gefunden!

Die Zutaten:
1 Server
2 Eier
Eine Prise php Kenntnisse
Natürlich Eclipse mit der laufenden Android Sdk
und gute Kenntnisse in Android & Java.

Vorbereitung:
Ihr legt eine MySql Tabelle an (Wer noch einen Server und Zugriff auf MySql Datenbanken braucht kann sich hier kostenlos anmelden), ich habe die Tabelle 'user' genannt mit den Feldern 'id', 'name', 'passwort' und 'email'.

Und zuletzt ein neues Projekt anlegen, dass ich gleichnamig zur tabelle user genannt habe!

Die Zubereitung:
Der erste Schritt war die Php Datei zu erstellen:
Hier mein Beispiel:
1<?php
2mysql_connect("deinhost","deinusername","deinpasswort");
3mysql_select_db("deinedatenbank");
4
5$q=mysql_query("SELECT * FROM user");
6while($e=mysql_fetch_assoc($q))
7 $output[]=$e;
8
9print(json_encode($output));
10
11mysql_close();
12?>
mit 'SELECT * FROM user' sagen wir dass alles aus der Tabelle user ausgewählt werden soll!
ihr könnt natürlich alles möglich auswählen wie ihr wollt aber ich habe bewusst erstmal die Abfrage simpel gehalten!
Diese php Datei muss dann auf euren Server hochgeladen werden so dass sie unter http://deinehomepage.de/deinephpDatei.php
abrufbar ist!

Als 2. öffnet ihr gleich die manifest.xml in eurem Projekt und fügt eine sehr wichtige Zeile ein die sehr häufig vergessen wird:
1<uses-permission android:name="android.permission.INTERNET" />

Dann ändert ihr eure bisherige Activity folgendermaßen ab:
1public class test2 extends ListActivity {
2 InputStream is;
3 ArrayList<String> results = new ArrayList<String>();
4 JSONObject json_data;
5
6@Override
7 public void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9 getData();
10 }
gleich bei Start der Activity wird die folgende Methode getData() aufgerufen:

1public void getData() {
2String result = "";
3 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
4
5 try{
6 HttpClient httpclient = new DefaultHttpClient();
7 HttpPost httppost = new HttpPost("http://deinehomepage.de/deinephpDatei.php");
8 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
9 HttpResponse response = httpclient.execute(httppost);
10 HttpEntity entity = response.getEntity();
11 is = entity.getContent();
12 }catch(Exception e){
13 Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
14 }

In diesem Abschnitt wird die Verbindung zu der Webseite und somit auch zu der Php Datei hergestellt!
Wenn der Url richtig eingegeben wurde und existiert dürfte eigentlich kein Fehler in der Logcat stehen.

Im nächsten Abschnitt werden die Tabellendaten, die von der Php Datei ausgelesen wurden in dem 'String result' gespeichert!
1try{
2 BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
3 StringBuilder sb = new StringBuilder();
4 String line = null;
5 while ((line = reader.readLine()) != null) {
6 sb.append(line + "n");
7 }
8 is.close();
9 result=sb.toString();
10 }catch(Exception e){
11 Log.e("log_tag", "Error converting result "+e.toString());
12 }

Auch hier dürfte nichts in der Logcat erscheinen wenn ihr alle Schritte genau befolgt habt.

Jetzt wird der 'String result' in einen JSONArray convertiert so kann er leichter ausgelesen werden!
1try{
2 JSONArray jArray = new JSONArray(result);
3 for(int i=0;i<jArray.length();i++){
4 json_data = jArray.getJSONObject(i);
5 results.add((String) json_data.get("id") + " "+ json_data.get("name"));
6 }
7 fillList();
8 }
9 catch(JSONException e){
10 Log.e("log_tag", "Error parsing data "+e.toString());
11 }
12 }


Und zu guter letzt wird results in die ListView geschrieben:
1public void filllist() {
2 this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results));
3 }

und jetzt müssten die Daten aus der Tabelle erscheinen!

Ich habe das ganze noch schöner gestaltet mit einem ProgressDialog damit man sieht wann er läd aber das ist ganz euch überlassen!

Für Rechtschreibfehler entschuldige ich mich und Fragen, Anregungen und Verbesserungsvorschläge sind erwünscht!

Viel Spaß beim Coden!

EDIT: Hier könnt ich euch die Java datei runterladen mit dem ProgressDialog!

— geändert am 27.09.2011, 19:50:09

"Hard work beats talent, when talent fails to work hard"

Mathis SchülingkamparbengieNiklas B.Ansgar MChris Kegel

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

28.11.2010, 14:17:42 via Website

Sieht sehr gut aus das Tutorial,gut zu lesen
Vllt wäre es ganz interessant zu sehen, wie du das mit dem Progressdialog gemacht hast...

EDIT

Für den
1handler.sendEmptyMessage(0);

gibts es keine zuweisung

— geändert am 28.11.2010, 14:27:33

Gruß Alexander

Antworten
L3322
  • Forum-Beiträge: 467

28.11.2010, 14:28:55 via App

ja den habe ich vergessen rauszumachen!
entfern den einfach und probiers ich lade dann den ganzen Code hoch!

"Hard work beats talent, when talent fails to work hard"

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

28.11.2010, 15:13:37 via Website

Thx dass du den ganzen code hochlädst

— geändert am 28.11.2010, 15:26:25

Gruß Alexander

Antworten
L3322
  • Forum-Beiträge: 467

28.11.2010, 16:01:15 via Website

Alexander Rock
Thx dass du den ganzen code hochlädst
Kein Problem

"Hard work beats talent, when talent fails to work hard"

Antworten
MB Power
  • Forum-Beiträge: 28

01.01.2011, 01:18:05 via Website

Danke für das Tutorial.

Wäre es bitte möglich den ProgressDialog zu posten, oder den Link zu erneuern. Danke. :-)

Antworten
L3322
  • Forum-Beiträge: 467

01.01.2011, 02:39:25 via App

MB Power
Danke für das Tutorial.

Wäre es bitte möglich den ProgressDialog zu posten, oder den Link zu erneuern. Danke. :-)
Ich werde gleich morgen den Link erneuern...
Bis dann

"Hard work beats talent, when talent fails to work hard"

Antworten
MB Power
  • Forum-Beiträge: 28

02.01.2011, 14:22:43 via Website

Es wäre auch ausreichend, wenn Du den ProgressDialog posten würdest. :-)

Antworten
Gelöschter Account
  • Forum-Beiträge: 80

16.02.2011, 13:36:07 via Website

Hey,

super Tutorial!

der Link funktioniert bei mir leider nicht.

lg
manu

Ansgar MKevin W.

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

20.05.2011, 16:15:22 via Website

Hey,
auf Nachfrage hier mal die Möglichkeit, wie man eine Liste mit dem simple_list_item_2.xml hinkriegt. Poste das mal hier, weil es darauf aufbaut.
Hierfür braucht man einen SimpleAdapter und eine ArrayList, mit einer HashMap. (Die ArrayList ersetzt die andere von L3322)
1ArrayList results = new ArrayList<HashMap<String,String>>();
2
3SimpleAdapter adapter = new SimpleAdapter(this, results,
4 android.R.layout.simple_list_item_2,
5 new String[] {"line1","line2"},
6 new int[] {android.R.id.text1,android.R.id.text2});

Diesen Adapter setzt man mit
1this.setListAdapter(adapter);

Nun muss nur die Array List in der For-Schleife nur noch anders gefüllt werden.
Statt der alten For-Schleife schreiben wir
1for(int i=0;i<jArray.length();i++){
2 HashMap hm = new HashMap();
3 json_data = jArray.getJSONObject(i);
4 hm.put("line1", json_data.get("id"));
5 hm.put("line2", json_data.get("name"));
6
7 results.add(hm);
8 fillList();
9 }

Das sollte es eigentlich sein.. Habs allerdings nicht getestet :)
Lg Ansgar

http://www.c-labs-android.de

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

14.07.2011, 18:06:14 via Website

Hallo Ansgar, L3322,
könnte einer von euch das Tutorial eventuell noch so erweitern, dass man einzelne Daten an bestimmten Plätzen einer Row angezeigt bekommt?
Wie z.b bei der Ap-App

Praktisch wäre auch, wenn man auf eine Row klickt sich dann eine neue Activity öffnet und dann dort alles ausführlich zu lesen ist?

— geändert am 14.07.2011, 18:10:30

Gruß Alexander

Antworten
L3322
  • Forum-Beiträge: 467

19.07.2011, 11:57:59 via App

Probiers doch erstmal selbst ;-)

"Hard work beats talent, when talent fails to work hard"

Ansgar M

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

26.07.2011, 20:37:54 via Website

Also,
die "Plätze" an denen die Daten angezeigt werden, definierst du ja in der xml. Das sollte doch machbar sein, oder?
Lg Ansgar

http://www.c-labs-android.de

Antworten
Daniel T.
  • Forum-Beiträge: 3

10.02.2012, 14:55:13 via Website

hey L3322,

danke für dieses sehr gute Tutorial, könntest du dir bitte noch einmal den Link ansehen, er funktioniert leider nicht...

Danke & lg

Antworten
Benedikt B.
  • Forum-Beiträge: 3

11.04.2012, 10:50:28 via Website

Vielen Dank für Dein Tutorial.
Könnte Du bitte das File noch mal irgendwo hosten.
Ein weiteres Problem ist, dass der Code aus deinem Tutorial nicht berücksichtigt, dass seit Honeycomb keine Internetzugriffe aus dem Main Thread erlaubt sind.
Im LogCat taucht die Fehlermeldung "Fehler bei der http verbindung android.os.NetworkOnMainThreadException" auf.
Könntet Ihr am Besten vor dem erneuten Uploaden des Files den Code entsprechend anpassen.
Ich habe bereits nach möglichen Lösungsansätzen für dieses Problem gesucht bin daraus aber nicht wirklich schlau geworden.

Vielen Dank

Antworten
Sascha
  • Forum-Beiträge: 1

06.05.2012, 21:56:17 via Website

hallo.
ich fand den Artikel sehr hilfreich und bin wie mein Vorposter auf das gleiche Problem gestoßen.
Da man den Thread sehr schnell auch beim Googlen findet, wenn man eine Datenbankabfrage gestalten will,
werde ich die Lösung dieses Problems mal posten (Änderungen gerne gesehen, das ist nur meine Lösung).

1InputStream is;
2 ArrayList<String> results = new ArrayList<String>();
3 JSONObject json_data;
4 Boolean dataComplete = false;
5
6
7 @Override
8 public void onCreate(Bundle savedInstanceState) {
9 super.onCreate(savedInstanceState);
10
11 getData();
12
13 while(!this.dataComplete) // es soll solange gewartet werden bis die ArrayList ganz gefüllt ist und die Abfrage beendet wurde
14 {
15 try {
16 Thread.sleep(50);
17 } catch (InterruptedException e) {
18 // TODO Auto-generated catch block
19 e.printStackTrace();
20 }
21 }
22
23 this.fillList();
24 }
25
26 public void getData() {
27
28 Thread t = new Thread() {
29
30 private String result = "";
31
32 public void run()
33 {
34 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
35
36 try{
37 HttpClient httpclient = new DefaultHttpClient();
38 HttpPost httppost = new HttpPost("http://DEINE HOMEPAGE.php");
39 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
40 HttpResponse response = httpclient.execute(httppost);
41 HttpEntity entity = response.getEntity();
42 is = entity.getContent();
43 }
44 catch(Exception e){
45 Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
46 }
47
48 try{
49 BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
50 StringBuilder sb = new StringBuilder();
51 String line = null;
52 while ((line = reader.readLine()) != null) {
53 sb.append(line + "n");
54 }
55 is.close();
56 result=sb.toString();
57 }
58 catch(Exception e){
59 Log.e("log_tag", "Error converting result "+e.toString());
60 }
61
62 try{
63 JSONArray jArray = new JSONArray(result);
64 for(int i=0;i<jArray.length();i++){
65 json_data = jArray.getJSONObject(i);
66 results.add((String) json_data.get("id") + " "+ json_data.get("nickname"));
67
68 }
69
70 dataComplete = true;
71 }
72 catch(JSONException e){
73 Log.e("log_tag", "Error parsing data "+e.toString());
74 }
75 }
76
77
78 };
79
80 t.start();
81
82 }
83
84
85
86 public void fillList() {
87 this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results));
88 }

Grüße ;)

— geändert am 06.05.2012, 21:57:15

Niklas B.

Antworten
Benedikt B.
  • Forum-Beiträge: 3

11.05.2012, 14:59:57 via Website

Da ich Neueinsteiger in Sachen Android bin habe ich keine Ahnung wo ich den von Sascha geposteten Code einfügen muss und welche Einstellung ich ansonsten noch vornehmen muss.
Was genau muss ich letztendlich machen damit mir eine Liste mit den Usern aus der Datenbank angezeigt wird?

Vielen Dank

Antworten
Gelöschter Account
  • Forum-Beiträge: 2

26.08.2012, 22:42:28 via Website

Hallo, mich würde dies auch interessieren, da ich auch neu in Java bin :)
Wäre echt super!

Antworten
Sebastian Eßling
  • Forum-Beiträge: 12

20.09.2012, 15:23:09 via Website

Hey ihr könnt das entweder direkt in eure Klasse der Activity einfügen oder aber in eine neue Klasse. Defacto braucht ihr später aber eine Klasse die von ListViewActivity erbt. In der ruft ihr dann direkt beim Aufruf die Methode auf die euch das result liefert. Eigentlich ist das ganz oben in dem Post alle gut erklärt.

Ich habe allerdings ein Problem. Wenn ich den Code genau wie ganz oben aufgeführt benutze und das Problem mit dem Thread behoben habe steht in meinem result immer "No input file specified". Was hat das zu bedeuten??? Mein php skript liefert Jsondaten aus. :-(

Antworten
Lorenz S.
  • Forum-Beiträge: 2

23.09.2012, 20:42:47 via Website

Hallo Leute,

nach einiger Zeit rumbasteln bekomm ich jetzt endlich meine daten aus der Datenbank per Logcat angezeigt.
Ich hab jetzt schon rumprobiert ohne Ende aber komm nicht drauf wie ich die Daten z.b. in einen TextView bekomm.
Wahrscheinlich stehts schon da oder es is extrem easy aber ich checks im mom garned :D
Wenn ihr ein kleines Beispiel posten könntet wär ich euch echt dankbar :)

Antworten
Niklas B.
  • Forum-Beiträge: 4

25.09.2012, 17:38:07 via Website

Hallo zusammen,

vielen lieben Dank für die Anleitung. Ich kam wunderbar damit zurecht und sie ist gut zu lesen.
Allerdings gibt es bei mir noch ein kleines Problem.
Beim konvertieren von der string Variable result in das JSONArray wird eine Fehlermeldung ausgegeben (LogCat)
"Value <!DOCTYPE of type java.lang.String cannot be converted to JSONArray"
Habe schon einige Dinge ausprobiert und nach einer Lösung gesucht, kam allerdings bis jetzt zu keinem Ergebniss.

Wäre nett, wenn mir da jeman helfen könnte.

Daten zum Projetk:
Android v2.3.3

MfG
Niklas

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

05.10.2012, 23:15:39 via App

Hallo,
das mit dem Doctype klingt, als sei dein JSON fehlerhaft.
Lg Ansgar

http://www.c-labs-android.de

Antworten
Bastian
  • Forum-Beiträge: 2

13.04.2013, 11:28:46 via Website

Hallo,

ich bin neu in der Android-Ecke.
Habe bisher die größten Erfahrungen mit der Webentwicklung gemacht und probiere mich jetzt mal an Android.
Derzeit hänge ich auch am auslesen von Daten aus einer Datenbank.
Über Google fand man sehr schnell hier her, bekomme jetzt allerdings auch einen Fehler im Log angezeigt.
Ich habe den angepassten Code von "Sascha" genommen.

Sobald ich die App auf einem echten Device (kein emu) starte, bekomme ich im Log folgende Meldung ausgegeben:

Error parsing data org.json.JSONException: No value for id
(Sorry, musste den Fehler abschreiben, kann man irgendwie ausm LogCat rauskopieren?)

Die Stelle auf die sich der Fehler bezieht, wird denk ich an folgender Stelle generiert:
1catch(JSONException e){
2 Log.e("log_tag", "Error parsing data "+e.toString());
3 }

Könnt ihr mir bitte weiter helfen? :)

€dit: Meine php liefert Daten aus:
freaks4posts.de/android/test.php

Vielen Dank


€dit:
Bin einen Schritt weiter gekommen.
Groß- und Kleinschreibung beachten :D
Da ich in meiner Datenbank auch ein "ID" Feld habe, hab ich nicht damit gerechnet.
Dein "id" in "ID" geändert und es geht weiter :)
Der Fehler ist schonmal weg, dafür sind jetzt aus dem "einen" Fehler ganz ganz viele Fehler entstanden. :(

04-13 11:41:31.359: D/libc(9837): Forward DNS query to netd(h=freaks4posts.de s=^)
04-13 11:41:31.765: D/libEGL(9837): loaded /system/lib/egl/libGLES_android.so
04-13 11:41:31.765: D/libEGL(9837): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
04-13 11:41:31.773: D/libEGL(9837): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
04-13 11:41:31.773: D/libEGL(9837): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
04-13 11:41:31.898: D/OpenGLRenderer(9837): Enabling debug mode 0
04-13 11:41:31.898: E/ArrayAdapter(9837): You must supply a resource ID for a TextView
04-13 11:41:31.906: D/AndroidRuntime(9837): Shutting down VM
04-13 11:41:31.906: W/dalvikvm(9837): threadid=1: thread exiting with uncaught exception (group=0x40ab0210)
04-13 11:41:31.906: E/AndroidRuntime(9837): FATAL EXCEPTION: main
04-13 11:41:31.906: E/AndroidRuntime(9837): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.AbsListView.obtainView(AbsListView.java:2144)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.ListView.makeAndAddView(ListView.java:1772)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.ListView.fillDown(ListView.java:672)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.ListView.fillFromTop(ListView.java:732)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.ListView.layoutChildren(ListView.java:1625)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.AbsListView.onLayout(AbsListView.java:1974)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.view.View.layout(View.java:11306)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.view.ViewGroup.layout(ViewGroup.java:4224)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.view.View.layout(View.java:11306)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.view.ViewGroup.layout(ViewGroup.java:4224)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.view.View.layout(View.java:11306)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.view.ViewGroup.layout(ViewGroup.java:4224)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.view.View.layout(View.java:11306)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.view.ViewGroup.layout(ViewGroup.java:4224)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1531)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2558)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.os.Handler.dispatchMessage(Handler.java:99)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.os.Looper.loop(Looper.java:137)
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.app.ActivityThread.main(ActivityThread.java:4697)
04-13 11:41:31.906: E/AndroidRuntime(9837): at java.lang.reflect.Method.invokeNative(Native Method)
04-13 11:41:31.906: E/AndroidRuntime(9837): at java.lang.reflect.Method.invoke(Method.java:511)
04-13 11:41:31.906: E/AndroidRuntime(9837): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
04-13 11:41:31.906: E/AndroidRuntime(9837): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
04-13 11:41:31.906: E/AndroidRuntime(9837): at dalvik.system.NativeStart.main(Native Method)
04-13 11:41:31.906: E/AndroidRuntime(9837): Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
04-13 11:41:31.906: E/AndroidRuntime(9837): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:379)
04-13 11:41:31.906: E/AndroidRuntime(9837): ... 30 more

AAAhhhh... auf meinem Smartphone stürzt die App mit folgender Meldung ab:
"Unfortunately, MusicDatabase has stopped."


€dit #3:
Fehler gefunden -.-
Da ich auch etwas mit dem Code rumspiele um diesen zu verstehen, habe ich vergessen etwas wieder zurück zu ändern.
Mein "setListAdapter" linkte auf ein falsches Layout. Ja so kann man auch lernen. Dämlicherweise steht der richtige in Saschas Code drin. Hab den nur in meinem Quellcode einmal geändert gehabt und anschließend vergessen. *facepalm*

— geändert am 13.04.2013, 11:54:44

Antworten
Bastian
  • Forum-Beiträge: 2

14.04.2013, 11:10:52 via Website

Hallo,

ich hätte jetzt doch nochmal eine Frage, bzw eine Bitte :)
Da es sonst zu unübersichtlich geworden wäre hab ich einen neuen Post geöffnet.
Sorry falls es euch anders lieber gewesen wäre.

Jedenfalls klappt es bei mir soweit alles.
Hab es sogar geschafft mehrere Activitys mit unterschiedlichen Abfragen zu erstellen (war für mich nicht einfach, da es immer wieder Fehler gab).
Meine Frage bezieht sich jetzt auf eine ProgressDialog, ich denke mal der ist da um eine Animation oder so anzuzeigen, während die Daten aus der Datenbank geladen werden?

Wenn ja... könntet ihr mir bitte helfen diesen mit einzubauen?
Der Link von L3322 geht leider nicht mehr.

Vielen Dank :)

Antworten
odinstar
  • Forum-Beiträge: 2

07.07.2013, 16:10:26 via Website

Guten Tag

Ich habe da eine frage ist es möglich eine Schleife damit zu machen? Sprich das alles paar Minuten aktualisiert wird was in der Datenbank steht?.

mit freundlichen grüßen

Antworten
impjor
  • Forum-Beiträge: 1.793

08.07.2013, 17:49:33 via App

Ja ist es.
Am einfachsten ist es, wenn du in deiner onResume() Methode einen Timer startest und in der onPause wieder beendest.
Im Timer wird dann das ListView aktualisiert.
Allerdings ist das hier ein Tutorial-Forum, vielleicht ist es in Zukunft angebrachter, im normalen Entwickler-Forum zu posten.

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
odinstar
  • Forum-Beiträge: 2

10.07.2013, 17:21:50 via Website

Guten Tag
Danke für die antwort aber meine frage bezieht sich mehr zu dem code hier

weil wenn ich das richtig sehe ist da eine schleife drin nur die was genau macht die?

1InputStream is;
2 ArrayList<String> results = new ArrayList<String>();
3 JSONObject json_data;
4 Boolean dataComplete = false;
5
6
7 @Override
8 public void onCreate(Bundle savedInstanceState) {
9 super.onCreate(savedInstanceState);
10
11 getData();
12
13 while(!this.dataComplete) // es soll solange gewartet werden bis die ArrayList ganz gefüllt ist und die Abfrage beendet wurde
14 {
15 try {
16 Thread.sleep(50);
17 } catch (InterruptedException e) {
18 // TODO Auto-generated catch block
19 e.printStackTrace();
20 }
21 }
22
23 this.fillList();
24 }
25
26 public void getData() {
27
28 Thread t = new Thread() {
29
30 private String result = "";
31
32 public void run()
33 {
34 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
35
36 try{
37HttpClient httpclient = new DefaultHttpClient();
38HttpPost httppost = new HttpPost("DEINE HOMEPAGE.php");
39 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
40 HttpResponse response = httpclient.execute(httppost);
41 HttpEntity entity = response.getEntity();
42 is = entity.getContent();
43 }
44 catch(Exception e){
45 Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
46 }
47
48 try{
49 BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
50 StringBuilder sb = new StringBuilder();
51 String line = null;
52 while ((line = reader.readLine()) != null) {
53 sb.append(line + "n");
54 }
55 is.close();
56 result=sb.toString();
57 }
58 catch(Exception e){
59 Log.e("log_tag", "Error converting result "+e.toString());
60 }
61
62 try{
63 JSONArray jArray = new JSONArray(result);
64 for(int i=0;i<jArray.length();i++){
65 json_data = jArray.getJSONObject(i);
66 results.add((String) json_data.get("id") + " "+ json_data.get("nickname"));
67
68 }
69
70 dataComplete = true;
71 }
72 catch(JSONException e){
73 Log.e("log_tag", "Error parsing data "+e.toString());
74 }
75 }
76
77
78 };
79
80 t.start();
81
82 }
83
84
85
86 public void fillList() {
87 this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results));
88 }

mfg

Antworten
Christian
  • Forum-Beiträge: 307

10.07.2013, 22:27:19 via Website

Hi odinstar,


weil wenn ich das richtig sehe ist da eine schleife drin nur die was genau macht die?
und welche der drei schleifen meinst du jetzt?

die erste?
die Antwort steht im Kommentar: // es soll solange gewartet werden bis die ArrayList ganz gefüllt ist und die Abfrage beendet wurde
die Zeile Thread.sleep(50); läßt die schleife für 50 zeiteinheiten(keine ahnung obs ms oder s sind) schlafen und dann wird mittels der Variable !this.dataComplete geschaut ob der auslesen aus der DB schon fertig ist falls ja wird die schleife abgebrochen falls nicht geht der Spass wieder von vorne los. (sieht irgendwie recht quick-and-dirty aus)

Wenn ich die Zweite Schleife richtig verstehe ließt die das Ergebnis der Web Abfrage aus und schreib das in einen String. Dieser wird dann in der dritten nochmal ausgelesen und in ein JSON Array gespeichert.



Sprich das alles paar Minuten aktualisiert wird was in der Datenbank steht?.
Stichwort: AlarmManager

Mfg Christian

— geändert am 10.07.2013, 22:28:45

Antworten
impjor
  • Forum-Beiträge: 1.793

11.07.2013, 10:38:27 via App

Sorry, aber man lässt den UI Thread nie in einer Schleife warten!!!
Sonst kommt bei langsamer Internetverbindung eine "Reagiert nicht mehr"- Meldung.

Lieber so:
1void getData(Runnable afterLoading) {
2...
3//dataCompleted = true
4runOnUiThread(afterLoading);
5...
6}
7
8in onCreate:
9...
10getData(new Runnable {
11public void run() {
12fillList();
13}
14});
15} // OnCreate fertig
Gruß

— geändert am 11.07.2013, 10:42:47

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Mathis Schülingkamp
  • Forum-Beiträge: 5

12.08.2013, 12:42:15 via Website

Hey,
danke für dein geniales Tutorial!

Ich entwickel Webseiten Shop-Systeme und versuche mich jetzt an Android, und komme wirklich schnell voran.

Nur ein Problem habe ich:
Auch wenn alles soweit gut klappt,
bleibt der Bildschirm bei mir weiss..

Ich bin mir nicht sicher ob ich den Code richtig verstanden und verschachtelt habe, kannst Du mir da kurz helfen?

Danke!

Antworten
impjor
  • Forum-Beiträge: 1.793

13.08.2013, 22:58:18 via App

Dann poste nochmals deine gesamte geänderte Activity.

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Dennis Martin
  • Forum-Beiträge: 3

22.08.2013, 12:15:44 via Website

Wow wirklich super Arbeit! Riesen Dank an dich, klappt alles super!

Hätte aber eine Frage. Wie kann ich z.B. einzelne Namen in einer TextView ausgeben? Also einen Namen als String speichern und dann ausgeben.

Habe es versucht mit

name = json_data.get("name").toString();

aber irgendwie gibt die TextView mir dann nur [Ljava.lang-String@4177aeb0... aus.

Wäre sehr dankbar für eine Antwort!

Antworten
impjor
  • Forum-Beiträge: 1.793

22.08.2013, 23:30:07 via App

1. Ich hoffe du lädst nicht auch die Webseite im Main-Thread, so wie es der Thread-Ersteller tut!!!!!
Sonst funktioniert es mit Android 4.X NICHT!!!

2.Versuche es mal mit json_data.getString("name");

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Dennis Martin
  • Forum-Beiträge: 3

25.08.2013, 16:34:15 via Website

Nein lade es nicht im Main-Thread.

Danke für die Antwort!

Klappt nun!

— geändert am 26.08.2013, 12:56:32

Antworten
Peter Pan
  • Forum-Beiträge: 1

30.01.2014, 18:27:50 via Website

danke

— geändert am 05.02.2014, 18:40:43

Antworten
Daniel H.
  • Forum-Beiträge: 17

10.04.2014, 19:42:51 via Website

Gibt es zufällig schon jemanden, der es unter API 16 oder API 19 zum laufen gebracht hat?
Habe nämloich heute schon 6h herumprobiert, ohne jegliches Ergebnis einer Verbindung.
Würde mich freuen, wenn jemand den Code veröffentlichen könnte, der auf Honeycomb aufwärts läuft.

mfg,
Daniel

Antworten
impjor
  • Forum-Beiträge: 1.793

13.04.2014, 20:09:10 via App

Der Code sollte bis Android 3+ laufen. Ab Android 3+ fliegt wie gesagt eine NetworkOnMainThreadException.

Ohne genaue Fehlerbeschreibung und LogCat können wir dir aber nicht helfen.

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Daniel H.
  • Forum-Beiträge: 17

14.04.2014, 09:18:01 via Website

Ich probier heute nochmal was, danach poste ich die LogCat.
Denn diese spuckt auch folgende Meldung aus:
error opening trace file: No such file or directory (2)
Somit kommt das Programm nichtmal zum laufen - die grafische Oberfläche wird nichtmal angezeigt.

Grüße,
Daniel

Antworten
Daniel H.
  • Forum-Beiträge: 17

16.04.2014, 16:57:04 via Website

Hab es jetzt zum laufen gebracht, Schuld dürfte eine falsche Platzierung der Internetpermission der der Manifest gewesen sein! Das Programm läuft also bei mir jetzt mit KitKat auch! OHNE Threading oder AsyncTask!

— geändert am 16.04.2014, 16:58:34

Antworten
Gelöschter Account
  • Forum-Beiträge: 2

17.04.2014, 16:55:38 via App

hallo zusammen, vielen dank für die Beträge. bin echt am verzweifeln. Ich habe eben versucht den code zum laufen zu bringen, :( leider ohne Erfolg. er wirft immer die NullPointerException, Error parsing data org.json.JSONException und Fehler bei http Verbindung Java.lang.IllegalStateException: Target host must not be null, or set in Parameters. scheme=null, host=null, path=localhost/Java_dbtest.php. Woran liegt das? hoffe mir kann jemand helfen oder einen lauffähigen code dazu Posten. Vielen dank vorab.

Antworten
Daniel H.
  • Forum-Beiträge: 17

17.04.2014, 18:58:41 via Website

sa be

hallo zusammen, vielen dank für die Beträge. bin echt am verzweifeln. Ich habe eben versucht den code zum laufen zu bringen, :( leider ohne Erfolg. er wirft immer die NullPointerException, Error parsing data org.json.JSONException und Fehler bei http Verbindung Java.lang.IllegalStateException: Target host must not be null, or set in Parameters. scheme=null, host=null, path=localhost/Java_dbtest.php. Woran liegt das? hoffe mir kann jemand helfen oder einen lauffähigen code dazu Posten. Vielen dank vorab.

Hier hast du den bei mir unter 4.4.2 KitKat funktionierenden Code: Wenn die Internet Permission in der AndroidManifest richtig gesetzt ist und das PHP file am Server ist müsste es bei dir auch gehen!

EDIT: Kann den Code leider aufgrund dessen, dass das Forum wieder mal gealtig herumzickt nicht posten. Wer ihr dennoch will soll sich bitte bei mir via Privatnachricht melden.

mfg, Daniel H.

— geändert am 18.04.2014, 17:26:08

Antworten
Daniel H.
  • Forum-Beiträge: 17

18.04.2014, 17:29:04 via Website

Eine Frage an die, die sich mit dem Thema besser auskennen als ich:

Ist es denn möglich, die heruntergeladenen Datensätze der MySQL Tabelle in Variablen zu speichern? Bzw. die Daten in eine bestimme ListView eines verknüpfen Layouts auszugeben? Denn das Programm aus dem ersten Post nimmt ja ein vordefiniertes Layout der Listview. greift also nicht auf ein bestimmen Layout zu. (in diesem Falle nicht auf activity_main.xml)

Grüße, Daniel

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.288

22.04.2014, 17:24:38 via Website

Das kann garnicht sein, wenn es trotzem Funktioniert, dann schaltest du irgendwo die Policy ab und das ist nicht sinn der Sache. Nach den oberen Code(en) wir hier doch Threading benutzt..

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Daniel H.
  • Forum-Beiträge: 17

22.04.2014, 22:16:58 via Website

Frag mich nicht warum es ging, aber es lief. Da ich es aber in einem anderem Projekt bracuthe, musste ich dann doch AsyncTask bzw. zum schnellen fixen StrictMode verwenden.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.288

26.04.2014, 23:24:01 via App

Bitte nimm den AsyncTask. StrictMode geht gar nicht..

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Philipp S.
  • Forum-Beiträge: 2

31.03.2015, 17:28:05 via Website

Hey Daniel! Kannst du mir deinen funktionierenden Code zusenden? Das wäre extrem nett!

Mit freundlichen Grüßen
Philipp

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.288

31.03.2015, 17:38:22 via Website

Hallo Phillipp,
Herzlich wilkommen :)
darf ich dir einen Tipp geben: Selber schreiben, denn dann lernt man viel mehr, und kann sich nachher umso mehr freuen wenn es tut. :D

LG

— geändert am 31.03.2015, 17:38:33

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Philipp S.
  • Forum-Beiträge: 2

01.04.2015, 16:12:20 via Website

Danke für die nette Begrüßung Pascal! ;)

Das ist mir schon klar, aber da ich im App-Basteln noch relativ unerfahren bin würde ich etwas Hilfe benötigen!
Versuche so gut wie alles selbst zu schreiben, das habe ich bis jetzt aber nicht hinbekommen.

Lg

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.288

08.04.2015, 13:08:25 via App

Dann schau mal hier im Entwicklerforum vorbei. Da kannst du dann auch einen neuen Thread dazu eröffnen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten