Android Studio - Sybase SQL Anywhere 12 - Verbindungsproblem

  • Antworten:6
  • Bentwortet
John Archer
  • Forum-Beiträge: 4

13.04.2016, 00:29:04 via Website

Hallo,

mein Freund hat ein Problem mit Android Studio und der Datenbank Sybase SQL Anywhere 12.

Mit Java unter Eclipse hatte er keine Probleme sich mit der Datenbank zu verbinden.
Mit folgendem Code erfolgreich getestet:

import java.sql.*; 
public class ConnectAndQuery
{
        public static void main(String[] args)
        {
                    String                       host, port, datenbankName, jddcUrl, sql;
                    Connection                   conn;
                    Statement                    stmt;
                    ResultSet                    rs;

                    // Init
                    host = "xx.xx.xx.xx";
                    port = "port";
                    datenbankName = "datenbankName";

                    jddcUrl = "jdbc:sybase:Tds:" +  host + ":" + port + "?ServiceName=" + datenbankName;

                    // Verbindung mit der Datenbank herstellen
                    try
                    {
                               conn = DriverManager.getConnection(jddcUrl, "user", "pwd");
                               stmt = conn.createStatement();

                               // Führe SQL Statement aus
                               sql = "SELECT * FROM tabelle";
                               rs = stmt.executeQuery(sql);

                               // Zeige die Daten an
                               while(rs.next())
                               {
                                           String   spalte;

                                           spalte = rs.getString("spalte");
                                           System.out.println("Spalte: " + spalte);
                               }

                               // Datenbank Verbindung aufräumen
                               stmt.close();
                               conn.close();
                    }
                    catch(Exception e)
                    {                       // Fehlerbehandlung
                               e.printStackTrace();
                               return;
                    }
        }

}

Versucht er jedoch eine Verbindung über Android Studio, dann wirft Android Studio an dieser Stelle

conn = DriverManager.getConnection(jddcUrl, "user", "pwd");

eine Exception:

User uploaded photo

Diese Meldungen waren auf dem Datenbank-Server zu sehen:

User uploaded photo

Gibt es hier jemanden, der sich schon erfolgreich mit der SQL Anywhere 12 über Android Studio verbunden hat?
Was können wir sonst noch probieren?
Hat jemand einen Rat für uns?

Es muss aber die Sybase SQL Anywhere 12 DB sein!
Die App-Entwicklungsumgebung darf aber ruhig eine andere sein, falls sich damit das Problem lösen lässt ;-)

Gruß
John Archer

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

13.04.2016, 07:08:48 via App

Hallo John!
Das Problem liegt nicht an der Entwicklungsumgebung sondern an Android.
Ab Android 3.x müssen alle Netzwerkzugrifffe in einem anderen Thread erledigt werden. Meist verwendet man einen AsyncTask dafür
So musst du für jeden DM Zugriff den Thread aufrufen und die Daten per Callback in den MainThread transferieren.
Wenn man es aber richtig machen will, hat man einen Server mit Rest Api und dieser macht den DB Zugriff. Sonst hat du aus der App direkten Zugiff auf die DB. Das ist Sicherheitstechnisch schkecht..

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

Antworten
John Archer
  • Forum-Beiträge: 4

18.04.2016, 19:37:25 via Website

Hallo Pascal,

vielen Dank für deine Antwort.

Pascal P.

Das Problem liegt nicht an der Entwicklungsumgebung sondern an Android.
Ab Android 3.x müssen alle Netzwerkzugrifffe in einem anderen Thread erledigt werden. Meist verwendet man einen AsyncTask dafür
So musst du für jeden DM Zugriff den Thread aufrufen und die Daten per Callback in den MainThread transferieren.

Sorry, das hatte ich vergessen zu erwähnen. Mein Freund macht die Connection bereits über den Async Task.
Hier mal der betreffende Ausschnitt aus seinem Code:

public class MainActivity extends Activity
{
    private Context context;
    DatabaseConnector databaseConnector = new DatabaseConnector();
    AsyncTask<Void, Void, Kunde> asyncTaskconnection;
    Kunde kundenReferenz;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText editText = (EditText) findViewById(R.id.editText);

        final TextView textViewVorname = (TextView) findViewById(R.id.textViewVorname);
        final TextView textViewNachname = (TextView) findViewById(R.id.textViewNachname);
        final TextView textViewAlter = (TextView) findViewById(R.id.textViewAlter);

        Button buttonConnect = (Button) findViewById(R.id.buttonConnect);
        buttonConnect.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                context = getApplicationContext();

                String id = editText.getText().toString();

                databaseConnector.execute();    // (danger) HIER WIRD DIE DB ABFRAGE GESTARTET
            }
        });
    }
}

public class DatabaseConnector extends AsyncTask<Void,Void,Kunde>
{
    private Context context;
    private Connection connection = null;
    private Statement statement;
    private ResultSet result;
    private Kunde kundenReferenz;

    public DatabaseConnector()
    {

    }

    @Override
    protected Kunde doInBackground(Void... params)
    {

        try
        {
            String host = "xx.xx.xx.xx";
            String port = "port";
            String datenbankName = "datenbankName";
            String url = "jdbc:sybase:Tds:" +  host + ":" + port + "?ServiceName=" + datenbankName;

            Connection conn = DriverManager.getConnection(url, "user", "pwd");    // (danger) HIER WIRD DIE EXCEPTION GEWORFEN

            // DriverManager.getConnection wirft eine Exception :(
            // Nachfolgender Code wird daher nicht ausgeführt...
            //...Code entfernt

        }

        // catch-teil entfernt, da nicht nötig für das Verständnis!

}

Also warum wirft DriverManager.getConnection eine Exception?
Bzw. was macht mein Freund falsch?

Wenn man es aber richtig machen will, hat man einen Server mit Rest Api und dieser macht den DB Zugriff. Sonst hat du aus der App direkten Zugiff auf die DB. Das ist Sicherheitstechnisch schkecht..

Danke für den Hinweis! Das werde ich mal so weitergeben. :)

Gruß
John Archer

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

18.04.2016, 19:40:32 via Website

Hat das gerät einen jdbc Teiber?
Weiss nämlich nit ob alle das haben.
Sonst kann ich dir leider nicht weiterhelfen.
Dut das denn in einer normalen Java Desktopapplikation?

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

Antworten
John Archer
  • Forum-Beiträge: 4

18.04.2016, 19:55:20 via Website

:? Keine Ahnung... ich frag ihn morgen mal danach und melde mich dann wieder hier.

Danke für deine Hilfe.
Falls dir sonst noch etwas einfallen sollte, ich bin für jeden Tipp dankbar. (*)

[EDIT]

Hat das gerät einen jdbc Teiber?

Mir fällt gerade ein...
...das Gerät ist ein emuliertes Gerät aus dem Android Studio.

Außerdem kommt ja eine Verbindung zur DB zustande (siehe oben, Servermeldungen)
Nur dann passiert etwas innerhalb von getconnection (das eine Exception auslöst) und der Server bekommt das sogar mit: Servermeldung = "Verbindung [...] nicht normal beendet"

:?:?:?

Gruß
John Archer

— geändert am 18.04.2016, 20:06:08

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

18.04.2016, 20:20:56 via App

Lieber mal mit einem echten Gerät testen.
Ob der Emulator das unterstützt ist fraglich.
Zudem ist da die Netzwerkanbindung auch nir simuliert

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

Antworten
John Archer
  • Forum-Beiträge: 4

21.04.2016, 13:19:03 via Website

Hallo,

ich hab mir nun selber das Android Studio installiert, und hab mich die letzten Tage genauer mit dem Problem beschäftigt.

Leider ist mein Rechner lahm und kann auch nicht die Hardwarebeschleunigung verwenden, sodass ich keinen Emulator starten konnte.
Aber mit meinem Smartphone ging es ohne Probleme :)

Auf jeden Fall hab ich ein neues Projekt begonnen und versucht eine DB Verbindung mit Sybase herzustellen.
Nach ein paar Versuchen und viel Recherche (Danke Google <3 ) hab ich es hinbekommen.

Keine Ahnung was bei meinem Freund falsch lief, aber als er mein Projekt bei sich (mit seinem Emulator) getestet hat, lief alles einwandfrei. :*
Aber im Grunde sah mein Projekt nicht viel anders aus als seins :?
Egal er ist jetzt froh, dass er sich mit Sybase SQL Anywhere 12 verbinden kann.

Vielen Dank für deine Tipps Pascal!

Gruß
John

Pascal P.

Antworten