Hallo zusammen
Ich hoffe ich geh keinem auf den Wecker, weil ich schonwieder ne Frage stelle (Ansonsten bitte melden)
Ich habe für meine MySQL Verbindungen eine einzige Klasse. Darin sieht es
immer so aus. Die Funktion wird aufgerufen. Diese ruft die Funktion
Connection_Open auf, mach danach das was sie zu tun hat und ruft dann
Connection_Close auf. Fertig.
Im Code sieht das dann so aus:
package com.beta.blackrider.easyvoci;
import android.util.Log;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Black Rider on 09.07.2014.
*/
public class c_MySQL
{
///////////////////////////////////
///////Verbdinungsdeklarationen
////////////////////////////////////
private String TAG = "c_MySQL";
private final String url = "jdbc:mysql://meineschöndomain:3306/EasyVoci";
private final String user = "EasyVoci";
private final String pass = "**************";
private Connection con = null; //Unsere Connection
//Konstruktor
public c_MySQL()
{
}
//Öfnnen der Verbindung
private Boolean Connection_Open()
{
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance(); //Klasse aufrufen
con = DriverManager.getConnection(url, user, pass);
return true;
}
catch (Exception ex)
{
Log.e(TAG, ex.toString());
return false;
}
}
//Schliessen der Verbindung
private Boolean Connection_Close()
{
try
{
con.close();
return true;
}
catch (Exception ex)
{
Log.e(TAG, ex.toString());
return false;
}
}
////////////////////////////////////////////////////////////
/////////////Group
///////////////////////////////////////////////////////////
public x_Group Group_Download_Group(Integer fromuserid, String name)
{
try
{
if (Connection_Open()) //Das ganze nur wenn die Verbdinung erfolgreich geöffnet werden konnte
{
String query = "SELECT * FROM `Group` WHERE fromuserid = " + fromuserid + " AND name = '" + name + "';";
Statement st = con.createStatement(); //Statement laden
st.executeQuery(query); //Querydef und Ausführen
ResultSet rs = st.getResultSet(); //Daten holen
x_Group group = new x_Group();
while (rs.next()) //Alles was empfangen wurde durchgehen
{
group.id = rs.getInt("id");
group.name = rs.getString("name");
group.fromuserid = rs.getInt("fromuserid");
}
rs.close();
st.close();
Connection_Close(); //Verbindung schliessen
return group; //Gruppe zurückgeben
}
}
catch (Exception ex)
{
Log.e(TAG, ex.toString());
}
return new x_Group(); //Leerer User zurückgeben
}
}
Alles anzeigen
x_Group
ist in diesem Fall einfach eine Klasse um mit den Rückgabewerten
umzugenen, im Normalfall gleich wie die Tabelle im MySQL Server
public class x_Group
{
public Integer id = 0;
public Integer fromuserid = 0;
public String name = "";
}
Natürlich
hat es in dieser MySQL Klasse auch noch andere Funktionen, nebst dieser
Group_Download_Group auch noch Funktionen für das Herunterladen des
Users etc.
Jetzt folgendes:
- Mein App startet in der MainActivity. (Loginseite)
- Eingabe des Usernamen's und des Passworts
- Drücken auf Login
- Abgleich im AsyncTask mit dem Passwort vom User in der Datenbank (Hash Code)
- Prüfen
ob die Gruppe "General" existiert mit dem oben aufgelisteten Code.
(Funktioniert!) (Wenn sie nicht existiert noch eine erstellen) - Wenn das Userpasswort i.o. war, wenn ja, ab zur nächsten Activity.
- Dort werden alle Gruppen heruntergeladen und in einen Spinner geschrieben.
- Der User kann die Werte eintragen um einen neuen Eintrag zu machen und drückt auf speichern.
- Damit
die Gruppenid herausgefunden werden kann, wird wieder der
Group_Download_Group aufgerufen. (Wohlbemerkt, welche ja vorhin schon
super seinen Dienst verrichtet hat!
Fehler bei
Connection_Open() -->
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
Could not create connection to database
Ich verstehe es nicht.
- Die Klasse MySQL wird jedes mal neu erstellt.
- Die Funktion welche benutzt wird funktioniert, da sie ja früher im Code schonmal erfolgreich verwendet wurde.
- OpenConnection wird bis zu diesem Punkt mehrere male erfolgreich aufgerufen.
- Verbidnung wird jedes mal durch Connection.Close wieder geschlossen.
Aufruf der Funktion:
c_MySQL MySQL = new c_MySQL();
Integer groupid =
MySQL.Group_Download_Group(c_Glob_Variables.MyUser_Get().id,
Spinner_gorup.getItemAtPosition(Spinner_gorup.getSelectedItemPosition()).toString()).id;
Parameter die übergeben werden sind in Ordnung, laut Debugger: 1 und "General"
Variablen user, url und pass im Connection_open welche nicht funktionieren sind auch in Ordnung.
Getestet über mein Handy (Galaxy S3, Android 4.3) über WLan
Datenbank MySQL auf Synology NAS
Datenbankuser hat KEINE MAX_Connections beschränkung. (Zumal ja immer alle geschlossen werden)
Warum funktioniert es plötzlich nicht mehr?
Gruss Black Rider