MySql Datenbank in eine ListView auslesen!

  • Antworten:42
  • OffenNicht stickyNicht beantwortet

28.11.2010 14:09:09

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"

28.11.2010 14:17:42

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

01.01.2011 02:39:25

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"

20.05.2011 16:15:22

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

14.07.2011 18:06:14

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

11.04.2012 10:50:28

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

06.05.2012 21:56:17

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

11.05.2012 14:59:57

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

20.09.2012 15:23:09

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. :-(

23.09.2012 20:42:47

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 :)