1. Mitglieder surfen ohne Werbung auf Android-Hilfe.de! ✔ Jetzt kostenlos Mitglied in unserer Community werden.
  1. KL7000F, 28.10.2018 #1
    KL7000F

    KL7000F Threadstarter Erfahrener Benutzer

    Hallo,

    ich grüble bereits einige Zeit und steh derzeit am Schlauch. Ggf. kann mir jemand den entsprechenden Hinweis geben.

    Ich lese über die entwickelte App Daten aus einer MySQL-Datenbank auf meinem Server aus. Hierzu dient eine PHP-Datei als "Zwischenstück". Das ganze basiert auf folgendem Tutorial: Android App mit einer MySQL Datenbank verbinden (16.01.2016)

    Die Problematik: Ich erhalte zwar meine Daten in der "ActivityDataSource", aber hier stehen sie als String wie in etwa:

    Das Ganze möchte ich nun in eine ListView eintragen. Es scheitert bereits, dass die Daten (wie im Tutorial in ein TextView) in einen String in "MainActivity" gelangen.

    ActivityDataSource.java:
    Code:
    package de.ebn.Datasource;
    
    
    import android.os.AsyncTask;
    import android.util.Log;
    import android.widget.TextView;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.URL;
    import java.net.URLConnection;
    import java.net.URLEncoder;
    
    import de.ebn.MainActivity;
    
    public class ActivityDataSource extends AsyncTask<String, Void, String> {
    
        public String RuckgabeString = "";
    
        public ActivityDataSource(String RuckgabeString) {
            this.RuckgabeString = RuckgabeString;
        }
    
        @Override
        protected String doInBackground(String... params) {
            try {
                //openConnection();
    
                    StringBuffer dataBuffer = new StringBuffer();
                    dataBuffer.append(URLEncoder.encode("authkey", "UTF-8"));
                    dataBuffer.append(POST_PARAM_KEYVALUE_SEPARATOR);
                    dataBuffer.append(URLEncoder.encode(AUTHKEY, "UTF-8"));
                    dataBuffer.append(POST_PARAM_SEPARATOR);
                    dataBuffer.append(URLEncoder.encode("method", "UTF-8"));
                    dataBuffer.append(POST_PARAM_KEYVALUE_SEPARATOR);
                    dataBuffer.append(URLEncoder.encode(DESTINATION_METHOD, "UTF-8"));
    
                    //Adresse der PHP Schnittstelle für die Verbindung zur MySQL Datenbank
                    URL url = new URL("http://url.de/gateway.php");
                    conn = url.openConnection();
                    conn.setDoOutput(true);
                    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                    wr.write(dataBuffer.toString());
                    wr.flush();
    
    
                return readResult();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
        /**
         * Ließt das Ergebnis aus der geöffneten Verbindung.
         * @return liefert ein String mit dem gelesenen Werten.
         * @throws IOException
         */
        private String readResult()throws IOException{
            String result = null;
            //Lesen der Rückgabewerte vom Server
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line = null;
            //Solange Daten bereitstehen werden diese gelesen.
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            return sb.toString();
        }
    
        @Override
        protected void onPostExecute(String result) {
            if(!isBlank(result)) {
    
                this.RuckgabeString = result;
            }
        }
    
        private boolean isBlank(String value){
            return value == null || value.trim().isEmpty();
        }
    
    
    }
    MainActivity.java:
    Code:
    package de.ebn;
    
    import android.os.Bundle;
    //import android.support.design.widget.FloatingActionButton;
    //import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    //import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import de.ebn.Datasource.ActivityDataSource;
    
    public class MainActivity extends AppCompatActivity {
    
        int[] images = new int[20];
        String[] benutzername = new String[20];
        String[] status = new String[20];
    
        ListView lView;
        ListAdapter lAdapter;
    
        public String RuckgabeString = "";
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
    
            lView = (ListView) findViewById(R.id.androidList);
            lAdapter = new ListAdapter(MainActivity.this, benutzername, status, images);
            lView.setAdapter(lAdapter);
            lView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    
                    Toast.makeText(MainActivity.this, benutzername[i]+" "+status[i], Toast.LENGTH_SHORT).show();
    
                    new ActivityDataSource(RuckgabeString,"Read").execute("");
                    
                    //Wenn ich hier den RuckgabeString auswerte, ist nichts drin???
                }
            });
    
    
    
        }
    
        public String TimeStampNow() {
            Long tsLong = System.currentTimeMillis()/1000;
            return tsLong.toString();
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == R.id.action_settings) { return true;}
            return super.onOptionsItemSelected(item);
        }
    }
    
    Wer kann mir hierbei helfen bzw. auch vielleicht einen Tipp geben, wie ich die in eine ListView bekomme?

    Vielen Dank!
     
  2. jogimuc, 29.10.2018 #2
    jogimuc

    jogimuc Erfahrener Benutzer

    Hallo

    Also so wie ich deine Main Activity lese.

    Fragst du deine MySql erst innerhalb des Clicklistner der Liste ab.
    Deinen Adapter für die liste füllst du auch nicht mit den daten aus der DB.
    Zuerst musss du deine DB abfragen also die Daten holen. Diese Daten dann in eine Array Liste packen . Die kannst du dem Adapter übergeben und diesen Adapter der ListView.
    Beim holen der Daten (Abfragen ) kannst es ja gleich in eine String Liste laden.

    Ob die Daten auch richtig gelesen werden habe ich mir jetzt nicht angesehen. Also deine
    ActivityDataSource Klasse.
     
  3. KL7000F, 29.10.2018 #3
    KL7000F

    KL7000F Threadstarter Erfahrener Benutzer

    Hi,

    vielen Dank für deine Antwort. Es ist richtig, einige "Funktionen" sind hier noch außer Betrieb. Problematik aktuell ist, dass die ausgelesenen Daten in der ActivityDataSource.java nicht an die MainActivity übergeben werden.

    Code:
        protected void onPostExecute(String result) {
            if(!isBlank(result)) {
    
                this.RuckgabeString = result;
            }
        }
    In "result" ist alles vorhanden. Dann hängt es irgendwie. Im Tutorial ging dies direkt in ein TextView, was ich simpel mit einem String ersetzt habe. Da wird wohl der Denkfehler liegen, aber den hab ich noch nicht durchschaut.
     
  4. jogimuc, 29.10.2018 #4
    jogimuc

    jogimuc Erfahrener Benutzer

    Wie ich schon versucht habe zu erklären . liest du überhaupt nicht die daten aus der DB aus.

    Du willst innerhalb der Liste im Listner also wenn du auf ein Element klickst deine Daten auslesen.

    Wie soll das gehen erst die liste erstellen und dann auf nichts Klicken und damit das Auslesen der Daten veranlassen.

    Du musst die Daten in der onCreate aus lesen und dann der liste übergeben. Du hast noch gar keine Daten die du der liste geben kannst.

    diese zeile ist zb, totaler mist.
    lAdapter = new ListAdapter(MainActivity.this, benutzername, status, images);
    damit holst du niemal daten für deinen Adapter.
     
  5. KL7000F, 29.10.2018 #5
    KL7000F

    KL7000F Threadstarter Erfahrener Benutzer

    Ah jetzt weiß ich was du meinst. Ja richtig, das ist so natürlich falsch. War bzw. ist so nicht gedacht, damit hatte ich nur bewusst das "Auslesen" starten wollen. Die ListView ist in dem Fall mit 20 leeren Feldern gefüllt gewesen. ListView ist derzeit einfach nur leer implementiert, da die Problematik bzw. die Daten noch nicht so weit gekommen sind. Das ist etwas verwirrend, sorry.

    lAdapter wird hier von leeren String-Array gefüttert, was später ggf. anders umgesetzt wird.
     
  6. jogimuc, 29.10.2018 #6
    jogimuc

    jogimuc Erfahrener Benutzer

    wenn du mehr als nur einen String aus der Db auslesen willst .
    Musst du auch die readResult verändern wahrscheinlich auch das PHP damit du auch eine Liste und nicht nur einen String zurück bekommst.

    Mit dem Code aus dem Beispiel bekommst du immer einen String, den müsstest du dann selber auseinandernehmen und daraus eine Liste machen.
    dazu müsstest du in dem php ein trennzeichen einfügen zwischen den daten.

    Aber bevor du es an den Adapter weitergibst nicht im klicklistner der Liste.
     
  7. KL7000F, 29.10.2018 #7
    KL7000F

    KL7000F Threadstarter Erfahrener Benutzer

    Das hatte ich noch vor. Der String ist derzeit mit zwei Trennzeichen ausgestattet. # für ganze Datensätze und darin | für die einzelnen Elemente. Für die geringen Mengen in der DB ist bzw. sollte das ausreichend sein.

    Sieht so aus: #Id|Benutzername|blub|blub#Id|Benutzername|blub|blub#...
     
  8. jogimuc, 29.10.2018 #8
    jogimuc

    jogimuc Erfahrener Benutzer

    ok dann musst du mit String operationen dir den string zerlegen und in eine Arrayliste packen.
    bevor du es dem Listadapter geben kannst.
     
  9. deek, 29.10.2018 #9
    deek

    deek Android-Experte

    Ganz ehrlich, fang mit sowas gar nicht erst an. Was passiert wenn in einem der Datensätze ein # oder | vorkommt?
    Mach das ordentlich mit json. PHP kann das sicher generieren. Und auf dem Android kannst du dann Standardlibraries wie retrofit (bringt die komplette http kommunikaiton mit) oder gson (nur zum Json parsen) verwenden.
     
    jogimuc bedankt sich.
  10. KL7000F, 29.10.2018 #10
    KL7000F

    KL7000F Threadstarter Erfahrener Benutzer

    Kommt eigentlich nicht vor. Die Daten sind wirklich überschaubar. Dennoch werde ich mir json mal ansehen. Danke für den Hinweis!
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
Daten von Firebase mit Progressbar in RecyclerView laden Android App Entwicklung 21.10.2018
Datenschutzerklärung bei eigener App (ohne Erhebung von Daten) Android App Entwicklung 30.08.2018
alle 100 ms Daten über Bluetooth senden Android App Entwicklung 15.08.2018
Daten für eine Stundenplan-App Android App Entwicklung 23.05.2018
Daten speichern in einer Datei auf der jede Aktivität zugreifen kann Android App Entwicklung 12.05.2018
Daten von Android Wear zur Handy-App senden geht nicht Android App Entwicklung 03.04.2018
Sensible Daten löschen bei Diebstahl Android App Entwicklung 18.02.2018
Login merken und activities öffnen - shared preferences Android App Entwicklung 28.01.2018
Zweiten Spinner hinzufügen Android App Entwicklung 07.01.2018
[OFFEN] Upload Foto mit php to mysql blob Android App Entwicklung 03.01.2018
Du betrachtest das Thema "MySQL-Daten weiterverarbeiten?" im Forum "Android App Entwicklung",
  1. Android-Hilfe.de verwendet Cookies um Inhalte zu personalisieren und dir den bestmöglichen Service zu gewährleisten. Wenn du auf der Seite weitersurfst stimmst du der Cookie-Nutzung zu.  Ich stimme zu.