MySQL-Daten weiterverarbeiten?

KL7000F

KL7000F

Fortgeschrittenes Mitglied
Threadstarter
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:

#Id|Benutzername|blub|blub#Id|Benutzername|blub|blub#...
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!
 
J

jogimuc

Erfahrenes Mitglied
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.
 
KL7000F

KL7000F

Fortgeschrittenes Mitglied
Threadstarter
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.
 
J

jogimuc

Erfahrenes Mitglied
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.
 
KL7000F

KL7000F

Fortgeschrittenes Mitglied
Threadstarter
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.
 
J

jogimuc

Erfahrenes Mitglied
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.
 
KL7000F

KL7000F

Fortgeschrittenes Mitglied
Threadstarter
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#...
 
J

jogimuc

Erfahrenes Mitglied
ok dann musst du mit String operationen dir den string zerlegen und in eine Arrayliste packen.
bevor du es dem Listadapter geben kannst.
 
D

deek

Stammgast
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.
 
KL7000F

KL7000F

Fortgeschrittenes Mitglied
Threadstarter
Kommt eigentlich nicht vor. Die Daten sind wirklich überschaubar. Dennoch werde ich mir json mal ansehen. Danke für den Hinweis!
 
Oben Unten