Zugriff auf Online-mySQL-Datenbank von Android-App

  • Antworten:28
  • OffenNicht stickyBentwortet

01.02.2013 17:10:28 via Website

Hallo,

ich bin neu in der Android-Entwicklung und versuche, in meine App einen Datenbankzugriff einzubauen.
Dieser soll aus einer Webdatenbank (mySql) entsprechende Daten auslesen. Auf der Website, die die gleiche Datenbank verwendet, sieht das so aus:

1<?PHP
2 $dbhost = "localhost";
3 $dbname = "usr_web512_4";
4 $query = "SELECT * FROM `news_list` ORDER BY `id` DESC";
5 mysql_connect($dbhost, '******', '********');
6 mysql_select_db($dbname);
7 //...
8?>

Die Daten sollen von der App abgefragt werden und dann in einem TableLayout angezeigt werden.
Wie kann ich das realisieren?

01.02.2013 18:09:55 via Website

Hi Sebastian,

du könntest dein PHP-Script aus dem App per HTTP-GET oder HTTP-POST ansprechen. Das Script holt dann die Daten aus der DB und schreibt das Erbebnis in ne XML oder JSON. Diese gibst du dann als Antwort an dein Handy zurück. Dort parst du dann die XML oder JSON und zeigst die Daten auf dem Bildschirm an.

Mfg Christian

01.02.2013 18:45:05 via Website

Hi,

vielleicht wird es mit einem kleinem Beispiel klarer.

Aufruf einer Url mit Get-Parametern:

1http://www.meine_homepage.de/erstelleXML.php?name=Christian&zuname=Hempe

Das Script(erstelleXML.php) nimmt nun die Anfrage entgegen und baut die Antwort zusammen:
1<?php
2 echo "<xml><name>" + $_GET["name"] + "</name><zuname>"+ $_GET["zuname"] +"</zuname></xml>";
3?>

Anrtwort an dein App:
1<xml><name>Christian</name><zuname>Hempe</zuname></xml>

Verstehst du was ich meine?

Mfg Christian

— geändert am 01.02.2013 18:47:14

02.02.2013 14:09:00 via Website

Soweit schonmal danke.
Jetzt besteht noch die Frage, wie genau (Welche Java/Android-Klassen/Funktionen) ich das PHP-Skript anspreche und die Antwort an den Parser weiterleite.

EDIT: Ich hoffe es macht nichts, wenn die auszulesenden Daten HTML-Tags enthalten (aktuell: <ul>,<li>,<br/>)

— geändert am 02.02.2013 14:31:21

02.02.2013 14:39:28 via Website

Hi,

am einfachsten wäre das hier:

Get Beispiel:
1URL url = new URL("http://www.meine_homepage.de/erstelleXML.php?name=Christian&zuname=Hempe");
2InputStream is = url.openStream();

Post Beispiel:
1String body = "name=" + URLEncoder.encode( "Christian", "UTF-8" ) + "&" +"zuname=" + URLEncoder.encode( "Hempe", "UTF-8" );
2
3URL url = new URL( "http://www.meine_homepage.de/erstelleXML.php" );
4HttpURLConnection connection = (HttpURLConnection) url.openConnection();
5connection.setRequestMethod( "POST" );
6connection.setDoInput( true );
7connection.setDoOutput( true );
8connection.setUseCaches( false );
9connection.setRequestProperty( "Content-Type","application/x-www-form-urlencoded" );
10connection.setRequestProperty( "Content-Length", String.valueOf(body.length()) );
11
12OutputStreamWriter writer = new OutputStreamWriter( connection.getOutputStream() );
13writer.write( body );
14writer.flush();
15
16BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()) );
Beispiel aus "Java ist auch eine Insel"

den jeweiligen Parser fütterst du nun mit dem Inputstream und abgeht es.

mfg Christian

p.s. Da das scheinbar immer wieder zu Problem führt sei es hier nochmal gesagt ab der Android Version 3.0 müssen Netzwerkaufrufe in einem separaten Thread laufen ist das nicht so wird ne Exception von System geworfen

02.02.2013 15:37:51 via Website

Danke, ich werde es mal austesten. Jedoch habe ich noch folgendes Problem:

1try {
2 if (!InetAddress.getByName("( http: )//www (.) freakhall (.) ch/").isReachable(10000)) {
3 throw new TimeoutException();
4 }
5}

resultiert in eine Unknown Host Exception, wenn ich nur "(www.)freakhall.ch" (Die anzusprechende Seite) verwende, eine Timeout Exception.

PS: Ich habe im Manifest <uses-permission android:name="android.permission.INTERNET" /> verwendet, sollte noch eine andere Permission bemötigt werden, bitte ich auch hier um Hilfe.

PS: Die Klammern sind wegen dem Linkverbot

— geändert am 02.02.2013 15:38:42

02.02.2013 16:15:58 via Website

nd das Multithreading kann ich vorerst umgehen da ich Android 2.3.6 verwende
das solltest du nicht machen.
Wenn das Abarbeiten der Netzwerkfunktion zu lange dauert (zbsp. schlechte Datenverbindung) erhält dein User eine Nachricht in Form eines Dialogs.
Dieser sagt ihm das irgendwas mit der Anwendung nicht stimmt und gibt ihm dann die Möglichkeit deine App zu beenden oder zu warten bis deine App fertig ist mit dem was sie da macht.

02.02.2013 17:37:50 via Website

Das Programm gibt folgenden Fehler im LogCat aus:

102-02 17:26:51.906: E/NewsScreen /parser(13734): Error: org.xmlpull.v1.XmlPullParserException: Error parsing document. (position:line -1, column -1) caused by: org.apache.harmony.xml.ExpatParser$ParseException: At line 3, column 28: not well-formed (invalid token)

Die XML sieht so aus:

1<xml>
2 <entry>
3 <titel>Küchenumbau am 19.01.2013</titel>
4 <text>Am 19.Januar haben wir die Küche umgebaut:<br />
5<!--Rest weggelassen-->

Line 3 column 28 ist das Ende des <titel>-Tags. Der entsprechende Code folgt:

1public List<Entry> entries = new List<Entry>();
2//...
3try {
4
5 XmlPullParser parser = Xml.newPullParser();
6 parser.setInput(is, null);
7 //parser.require(XmlPullParser.START_TAG, null, "entry");
8 while (parser.next() != XmlPullParser.END_TAG) {
9 if (parser.getEventType() != XmlPullParser.END_TAG)
10 continue;
11 String name = parser.getName();
12 if (name.equalsIgnoreCase("entry")) {
13 entries.add(Entry.readEntry(parser));
14 } else {
15 Entry.skip(parser);
16 }
17 }
18
19 } catch (Throwable t) {
20 Log.e("NewsScreen /parser", "Error: "+ t.toString());
21 return 2;
22 }

Der Code ist von der developer DOT android DOT com-Seite kopiert und entsprechend abgeändert. Die Entry-Klasse ist ebenfalls von dort.
developer DOT android DOT com/training/basics/network-ops/xml DOT html

02.02.2013 18:32:51 via Website

Der Fehler liegt nicht in Deinem Code sondern im XML Dokument. Das ist nicht wellformed .. sagt doch schon die Fehlermeldung.

Ausserdem möchte ich mal behaupten, dass der eigentliche Fehler in Deiner Zeile 4 liegt. Die XML-Delklaration <xml> wird durch den Parser nicht berücksichtigt.

— geändert am 02.02.2013 18:36:26

lg Voss - Ach ja und noch was, die AndroidPIT-Regeln ლ(╹◡╹ლ) Android Security

02.02.2013 18:42:35 via Website

Woran liegt das? Hier mal das komplette XML:

1<xml>
2 <entry>
3 <titel>Küchenumbau am 19.01.2013</titel>
4 <text>Am 19.Januar haben wir die Küche umgebaut:<br />
5<ul><br />
6<li>Der Herd sowie einige Schränke wurden entfernt.<br />
7<li>Ein Durchgang von der Bar zur Küche wurde gesägt.<br />
8<li>Eine neue Wand zwischen Aufenthaltsraum und Küche wurde gebaut.<br />
9</ul></text>
10 </entry>
11
12 <entry>
13 <titel>Neue Facebookseite</titel>
14 <text>Zwei Anläufe sind gescheitert, daher nun der dritte: Das Freakhall hat ab heute eine neue <a href="unwichtiger Link den ich hier noch nicht posten darf">Facebookseite</a>. Diese soll aktueller gehalten werden und in naher Zukunft auch mit dieser Website verknüpft werden.</text>
15 </entry>
16 </xml>

Liegt das an den HTML-Tags in den <text>-</text>-Blocks oder woran liegt das?

02.02.2013 19:43:23 via Website

Das ist mir schon klar, aber wie genau soll ich die dann hinterher verarbeiten?
Soll dann hinterher &lt;ul&gt; dastehen? Und die <br />'s ersetze ich am Besten durch \n oder?

EDIT: Die Fehlermeldung ist immer noch die gleiche

1<xml>
2 <entry>
3 <titel>Küchenumbau am 19.01.2013</titel>
4 <text>Am 19.Januar haben wir die Küche umgebaut:&lt;br /&gt

— geändert am 02.02.2013 19:49:00