AsyncTask Probleme bei postgreSQL Verbindung

  • 5 Antworten
  • Letztes Antwortdatum
R

rush2rio

Ambitioniertes Mitglied
2
Hallo,
ich versuche über einen AsyncTask eine Verbindung zu meiner Postgresql Datenbank herzustellen und ein SQL Statement abzuschicken.
Funktioniert soweit auch wunderbar. Allerdings nur wenn ich die richtigen Verbindungseinstellungen (also host, database, user, pw,) bereits in den Code schreibe. Wenn ich die Activity ohne den korrekten Werten starte stürzt sie sofort ab.(siehe LogCat) Ich benötige jedoch die Möglichkeit das der Anwender die Verbindungseinstellungen manuell eintragen kann. d.h. das der Anwender einen Toast bekommt in dem er mitgeteilt bekommt das die Einstellungen nicht stimmen und er sie in der EinstellungsActivity ändert (und in SharedPreferences speichert).

Problem liegt wohl irgendwie bei Drivermanager.getConnection(url, pg_user, pg_pw);
Was mache ich falsch bzw hat einer eine Idee wie ich das machen könnte?
Vielen Dank

Code:
1 protected void onCreate(Bundle savedInstanceState) {
2	 super.onCreate(savedInstanceState);
3	 setContentView(R.layout.main);
4	
5	 getPrefs();
6 .
7 .
8 .
9  new FetchSQL().execute();
10 }
11
12 public void getPrefs() {
13	 SharedPreferences prefs = PreferenceManager
14	 .getDefaultSharedPreferences(this);
15
16	 pg_host = prefs.getString("host", "");
17	 pg_port = prefs.getString("port", "");
18	 pg_database = prefs.getString("database", "");
19	 pg_user = prefs.getString("user", "");
20	 pg_pw = prefs.getString("password", "");
21 }
22
23 
24	private class FetchSQL extends AsyncTask<Void,Void,String> {
25
26	 @Override
27	 protected String doInBackground(Void... params) {
28	 String retval="";
29	 try {
30	 Class.forName("org.postgresql.Driver");
31	 } catch (ClassNotFoundException e) {
32	 e.printStackTrace();
33	 retval = e.toString();
34	 Toast.makeText(MainActivity.this,e.toString(), Toast.LENGTH_LONG).show();
35	 }
36	 String url =   "jdbc:postgresql://"+pg_host+":"+pg_port+"/"+pg_database+"";
37	 Connection conn;
38	 try {
39	 DriverManager.setLoginTimeout(5);
40	 conn = DriverManager.getConnection(url, pg_user, pg_pw);
41	 Statement st = conn.createStatement();
42	 String sql;
43	 sql = //SQL ABFRAGE
44	 ResultSet rs = st.executeQuery(sql);
45	 while(rs.next()) {
46 
47	 //var .. = rs.getString("...");
48	 }
49	 rs.close();
50	 st.close();
51	 conn.close();
52	 }
53	 catch (SQLException e) {
54	 e.printStackTrace();
55	 retval = e.toString();
56	 Toast.makeText(MainActivity.this,e.toString(), Toast.LENGTH_LONG).show();
57	 }
58	 return retval;
59
60	 }
61	
62	 @Override
63	 protected void onPostExecute(String value) {
64 //Daten aus SQL Abfrage in TextView anzeigen
65 }

LogCat
Code:
102-14 12:21:18.707: W/System.err(2128): java.sql.SQLException: No suitable driver
202-14 12:21:18.767: W/System.err(2128): at java.sql.DriverManager.getConnection(DriverManager.java:182)
302-14 12:21:18.877: W/System.err(2128): at java.sql.DriverManager.getConnection(DriverManager.java:209)
402-14 12:21:18.928: W/System.err(2128): at .MainActivity$FetchSQL.doInBackground(MainActivity.java:318)
502-14 12:21:18.987: W/System.err(2128): at MainActivity$FetchSQL.doInBackground(MainActivity.java:1)
602-14 12:21:19.047: W/System.err(2128): at android.os.AsyncTask$2.call(AsyncTask.java:287)
702-14 12:21:19.099: W/System.err(2128): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
802-14 12:21:19.157: W/System.err(2128): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
902-14 12:21:19.217: W/System.err(2128): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
1002-14 12:21:19.267: W/System.err(2128): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
1102-14 12:21:19.437: W/System.err(2128): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
1202-14 12:21:19.467: W/System.err(2128): at java.lang.Thread.run(Thread.java:856)
 
Zuletzt bearbeitet:
Ich denk die Activity stürzt ab weil deine Daten
pg_host, pg_port, pg_database, pg_user und pg_pw leer sind.

Du hast wahrscheinlich zwei Möglichkeiten.

Entweder du setzt default werte

pg_user = prefs.getString("user", "HORSTMUELLER");

oder

du stellst sicher das angaben zur db Verbindung vor dem
DriverManager.getConnection(url, pg_user, pg_pw);
gesetzt wurden.

Die default werte müssen ja nicht die für
die db sein. Falls du dann keine Verbindung bekommst kannst du den user
ja die Möglichkeit geben neue Daten anzugeben.

Gruß
Jens
 
derjens schrieb:
Du hast wahrscheinlich zwei Möglichkeiten.

Entweder du setzt default werte

pg_user = prefs.getString("user", "HORSTMUELLER");

Die default werte müssen ja nicht die für
die db sein.

danke erstmal für die schnelle antwort!

des mit den default werten klappt zwar aber auch nur bei der jeweiligen verbindung zu meiner datenbank, wenn ich da jetzt "HORSTMUELLER" etc mach stürzt es wieder ab.

du stellst sicher das angaben zur db Verbindung vor dem
DriverManager.getConnection(url, pg_user, pg_pw);
gesetzt wurden.
versteht ich nicht was du damit meinst :blushing:
 
sonst keiner ne idee? :sad:
 
Die Fehlermeldung besagt eigentlich, dass (1) entweder der Postgrestreiber nicht gefunden wurde (das hätte aber den ersten Toast ausgelöst), oder (2) dass mit der URL etwas nicht stimmt (also dass ""jdbc:postgres:"" nicht ankommt).

Was noch sein könnte, ist, dass die Obfuscation dir einen Streich spielt. Aber auch das müsste eigentlich bei (1) schon krachen.

Ich würde beides mal im Debugger genau prüfen
 
Zuletzt bearbeitet:
habs geschafft
lag wohl daran das der Toast im background thread lief und somit nicht auf die ui zugreifen kann.
hab den toast jetzt im Postexecute drinnen.

trotzdem danke:biggrin:
 
Zuletzt bearbeitet:
Zurück
Oben Unten