Datenbankzugriff: NullPointerException beim Cursoraufruf

  • Antworten:6
Christian Helbig
  • Forum-Beiträge: 3

26.10.2011, 00:06:25 via Website

Hallo zusammen,

ich erhalte eine NullpointerException beim Versuch, einen Cursor über eine query-Abfrage zu erhalten.
Ich vermute, dass die Datenbank noch garnicht existiert. Laut JavaDoc wird diese zwar beim Erstaufruf erzeugt, aber so richtig sicher bin ich mir da auch nicht.
Inzwischen sehe ich den Wald vor lauter Bäumen nicht mehr. Kann mir bitte jemand sagen, wo der Fehler liegt? Ich komm nicht drauf...

Tools.java
1package bonussphere.softlevel.de;
2
3import bonussphere.softlevel.de.DBConnect.BiboTbl;
4import android.app.Activity;
5import android.app.AlertDialog;
6import android.database.Cursor;
7import android.database.sqlite.SQLiteStatement;
8
9public class Tools extends Activity{
10 DBConnect db = null;
11
12 public Tools() {
13 db = new DBConnect(this);
14 }
15
16 /**
17 * Erzeugt ein Meldungsfenster
18 *
19 * @param type Art der Nachricht (error = Fehler)
20 * @param text Zusatztext (z.B. Fehlertext)
21 */
22 public void showAlert(String type, String text) {
23 if (type == "error") {
24 AlertDialog.Builder msg = new AlertDialog.Builder(null);
25 msg.setMessage("Fehler\n\n" + text + "\nModul: " + super.toString())
26 .setPositiveButton("OK", null);
27 return;
28 }
29
30 if (type == "info") {
31 AlertDialog.Builder msg = new AlertDialog.Builder(null);
32 msg.setMessage("Information\n\n" + text + "\nModul: " + super.toString())
33 .setPositiveButton("OK", null);
34 return;
35 }
36 }
37
38 /**
39 * Wandelt einen String in eine Floatzahl um.
40 * Im Fehlerfall wird 0 zurückgegeben.
41 *
42 * @param preis Die umzuwandelnde Zahl.
43 * @return
44 */
45 public float StringToFloat(String preis) {
46 float preisF = 0F;
47
48 try {
49 preisF = Float.parseFloat(preis);
50 }
51 catch (NumberFormatException nfe) {
52 preisF = 0F;
53 }
54
55 return preisF;
56 }
57
58 /**
59 * Fügt einen neuen Benutzer hinzu, wenn dieser noch nicht vorhanden ist
60 * oder aktualisiert ihn, wenn er bereits vorhanden ist.
61 *
62 * @param db Datenbankinstanz
63 * @param bibo Bibliographiebezeichnung
64 * @param username Benutzername
65 * @param password Kennwort
66 * @return True, wenn der Schreibvorgang erfolgreich war. False wenn nicht.
67 */
68 public boolean setLogin(String biboname, String username, String password) {
69 SQLiteStatement stmt = null;
70 boolean erg = false;
71
72 try {
73 if (getUsername(biboname).length() == 0)
74 stmt = db.getWritableDatabase().compileStatement(BiboTbl.STMT_FULL_INSERT);
75 else
76 stmt = db.getWritableDatabase().compileStatement(BiboTbl.STMT_FULL_UPDATE);
77
78 stmt.bindString(1, biboname);
79 stmt.bindString(2, username);
80 stmt.bindString(3, password);
81
82 erg = stmt.executeInsert() != -1 ? true : false;
83 }
84 catch (Exception e) {
85 erg = false;
86 }
87 finally {
88 stmt.close();
89 }
90
91 return erg;
92 }
93
94 /**
95 * Gibt den Benutzernamen zurück, der zur angegebenen Bibliographiebezeichnung gehört.
96 *
97 * @param db Datenbankinstanz
98 * @param bibo Bibliographiebezeichnung
99 * @return Benutzername als String
100 */
101 public String getUsername(String biboname) {
102 Cursor cur = null;
103 String ergebnis = "";
104
105 try {
106 Hier ist der Cursor. Der ist Null und schmeißt eine NullPointerException
107 cur = db.getReadableDatabase().query(BiboTbl.TABLE_NAME,
108 new String[] {"username"},
109 "bibo = ",
110 new String[] {biboname},
111 null,
112 null,
113 null,
114 "1");
115
116 cur.moveToFirst();
117 ergebnis = cur.getString(0);
118 }
119 catch (Exception e) {
120 // TODO: handle exception
121 }
122 finally {
123 cur.close();
124 }
125
126 return ergebnis;
127 }
128
129 /**
130 * Gibt das Kennwort zurück, das zur angegebenen Bibliographiebezeichnung gehört.
131 *
132 * @param db Datenbankinstanz
133 * @param bibo Bibliographiebezeichnung
134 * @return Kennwort als String
135 */
136 public String getPassword(String biboname) {
137 Cursor cur = null;
138 String ergebnis = "";
139
140 try {
141 cur = db.getReadableDatabase().query(BiboTbl.TABLE_NAME,
142 new String[] {"password"},
143 "bibo = ",
144 new String[] {biboname},
145 null,
146 null,
147 null,
148 "1");
149 cur.moveToFirst();
150 ergebnis = cur.getString(0);
151 }
152 finally {
153 cur.close();
154 }
155
156 return ergebnis;
157 }
158
159 protected void finalize() {
160 if (db != null)
161 db.close();
162 }
163}

DBConnect.java
1package bonussphere.softlevel.de;
2
3import android.content.Context;
4import android.database.sqlite.SQLiteDatabase;
5import android.database.sqlite.SQLiteOpenHelper;
6
7public class DBConnect extends SQLiteOpenHelper{
8
9 private static final String DATENBANK_NAME = "bonussphere.db";
10 private static final int DATENBANK_VERSION = 1;
11
12 /**
13 * Stellt die Datenbankverbindung her.
14 *
15 * @param context Besitzerklasse dieser Datenbankverbindung.
16 */
17 public DBConnect(Context context) {
18 super(context, DATENBANK_NAME, null, DATENBANK_VERSION);
19 }
20
21 @Override
22 public void onCreate(SQLiteDatabase db) {
23 db.execSQL(BiboTbl.SQL_CREATE);
24 }
25
26 @Override
27 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
28 db.execSQL("DROP TABLE IF EXISTS " + BiboTbl.TABLE_NAME);
29 onCreate(db);
30 }
31
32 public interface BiboTbl {
33 String ID = "_id";
34 String BIBO = "biboname";
35 String USERNAME = "username";
36 String PASSWORD = "password";
37 String TABLE_NAME = "bibologin";
38
39 String SQL_CREATE = "CREATE TABLE IF NOT EXISTS bibologin (" +
40 "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
41 "biboname TEXT NOT NULL," +
42 "username TEXT NOT NULL," +
43 "password TEXT NOT NULL" +
44 ");";
45
46 String STMT_FULL_INSERT = "INSERT INTO bibo (biboname, username,ziel) VALUES (?, ?,?)";
47 String STMT_FULL_UPDATE = "UPDATE bibo SET biboname = ?, username = ?, password = ?)";
48 }
49}

Vielen Dank schonmal für alle Tipps.

Bye, Christian.

Antworten
Maximilian O
  • Forum-Beiträge: 990

26.10.2011, 09:24:08 via App

Startet die app einfach auf nem emulator. So kannst du überprüfen ob die db existiert.

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Christian Helbig
  • Forum-Beiträge: 3

26.10.2011, 11:33:15 via Website

Vielen Dank schonmal für die Hinweise :-) Ich werde heute Abend testen, woran es gelegen hat. Das fehlende ? hinter dem = scheint mir schonmal sehr verheißungsvoll :-)

Rafael K.
Poste doch mal die Exception.
Mit den Zeilennummern kann man den Fehler zurückverfolgen.

Ich benutze Eclipse zum Entwickeln. Habe bisher noch keine Stelle gefunden, wo er mir die Zeilennummern mit anzeigt. Wo genau muss ich da schauen?

Maximilian O

Startet die app einfach auf nem emulator. So kannst du überprüfen ob die db existiert.

Mache ich bereits. Wie sehe ich, ob die DB existiert?

Antworten
Philip M.
  • Forum-Beiträge: 90

26.10.2011, 11:36:39 via Website

Ich benutze Eclipse zum Entwickeln. Habe bisher noch keine Stelle gefunden, wo er mir die Zeilennummern mit anzeigt. Wo genau muss ich da schauen?

Das machst du am besten im LogCat in Eclipse (:

Antworten
Christian Helbig
  • Forum-Beiträge: 3

26.10.2011, 23:55:51 via Website

Hallo zusammen,

ich habe die Fehlerlisten entfernt, da ich festgestellt habe, dass da viele Einträge sind, die sicherlich für die Beantwortung uninteressant sind. Ich bitte dies zu entschuldigen. Weiterhin habe ich alle AlertMeldungen aus meinem Programm entfernt und damit schon mal eine ganze Menge Fehler beseitigt.

Das "Problem" dabei ist nun, dass es keine Fehler mehr gibt. Logcat meldet nichts auffälliges aus meinem Programm und dort wo ich versuche auf die Datenbank zuzugreifen bekommt der Cursor einfach keine Instanz geliefert. e.getMessage liefert null. Mein statement zum Schreiben der DAten bekommt ebenfalls nur null zurück.

Hier nochmal das LogCat protokoll gefiltert, nach dem was meine Anwendung verursacht (keine Systemmeldungen etc.)

110-27 15:47:21.314: W/ActivityThread(212): Application bonussphere.softlevel.de is waiting for the debugger on port 8100...
210-27 15:47:21.355: I/System.out(212): Sending WAIT chunk
310-27 15:47:21.363: I/dalvikvm(212): Debugger is active
410-27 15:47:21.563: I/System.out(212): Debugger has connected
510-27 15:47:21.563: I/System.out(212): waiting for debugger to settle...
610-27 15:47:21.764: I/System.out(212): waiting for debugger to settle...
710-27 15:47:21.963: I/System.out(212): waiting for debugger to settle...
810-27 15:47:22.163: I/System.out(212): waiting for debugger to settle...
910-27 15:47:22.373: I/System.out(212): waiting for debugger to settle...
1010-27 15:47:22.573: I/System.out(212): waiting for debugger to settle...
1110-27 15:47:22.773: I/System.out(212): waiting for debugger to settle...
1210-27 15:47:23.003: I/System.out(212): waiting for debugger to settle...
1310-27 15:47:23.248: I/System.out(212): waiting for debugger to settle...
1410-27 15:47:23.465: I/System.out(212): waiting for debugger to settle...
1510-27 15:47:23.683: I/System.out(212): debugger has settled (1381)
1610-27 15:57:03.313: W/ActivityThread(255): Application bonussphere.softlevel.de is waiting for the debugger on port 8100...
1710-27 15:57:03.334: I/System.out(255): Sending WAIT chunk
1810-27 15:57:03.343: I/dalvikvm(255): Debugger is active
1910-27 15:57:03.534: I/System.out(255): Debugger has connected
2010-27 15:57:03.543: I/System.out(255): waiting for debugger to settle...
2110-27 15:57:03.805: I/System.out(255): waiting for debugger to settle...
2210-27 15:57:04.004: I/System.out(255): waiting for debugger to settle...
2310-27 15:57:04.204: I/System.out(255): waiting for debugger to settle...
2410-27 15:57:04.438: I/System.out(255): waiting for debugger to settle...
2510-27 15:57:04.633: I/System.out(255): waiting for debugger to settle...
2610-27 15:57:04.856: I/System.out(255): waiting for debugger to settle...
2710-27 15:57:05.063: I/System.out(255): waiting for debugger to settle...
2810-27 15:57:05.293: I/System.out(255): waiting for debugger to settle...
2910-27 15:57:05.535: I/System.out(255): debugger has settled (1346)
3010-27 15:57:31.973: W/ActivityThread(281): Application bonussphere.softlevel.de is waiting for the debugger on port 8100...
3110-27 15:57:31.993: I/System.out(281): Sending WAIT chunk
3210-27 15:57:31.993: I/dalvikvm(281): Debugger is active
3310-27 15:57:32.193: I/System.out(281): Debugger has connected
3410-27 15:57:32.193: I/System.out(281): waiting for debugger to settle...
3510-27 15:57:32.433: I/System.out(281): waiting for debugger to settle...
3610-27 15:57:32.676: I/System.out(281): waiting for debugger to settle...
3710-27 15:57:32.936: I/System.out(281): waiting for debugger to settle...
3810-27 15:57:33.134: I/System.out(281): waiting for debugger to settle...
3910-27 15:57:33.394: I/System.out(281): waiting for debugger to settle...
4010-27 15:57:33.606: I/System.out(281): waiting for debugger to settle...
4110-27 15:57:33.824: I/System.out(281): waiting for debugger to settle...
4210-27 15:57:34.075: I/System.out(281): waiting for debugger to settle...
4310-27 15:57:34.293: I/System.out(281): debugger has settled (1435)
4410-27 15:58:29.463: W/ActivityThread(307): Application bonussphere.softlevel.de is waiting for the debugger on port 8100...
4510-27 15:58:29.483: I/System.out(307): Sending WAIT chunk
4610-27 15:58:29.493: I/dalvikvm(307): Debugger is active
4710-27 15:58:29.493: I/System.out(307): Debugger has connected
4810-27 15:58:29.493: I/System.out(307): waiting for debugger to settle...
4910-27 15:58:29.693: I/System.out(307): waiting for debugger to settle...
5010-27 15:58:29.903: I/System.out(307): waiting for debugger to settle...
5110-27 15:58:30.147: I/System.out(307): waiting for debugger to settle...
5210-27 15:58:30.405: I/System.out(307): waiting for debugger to settle...
5310-27 15:58:30.649: I/System.out(307): waiting for debugger to settle...
5410-27 15:58:30.858: I/System.out(307): waiting for debugger to settle...
5510-27 15:58:31.065: I/System.out(307): waiting for debugger to settle...
5610-27 15:58:31.284: I/System.out(307): waiting for debugger to settle...
5710-27 15:58:31.531: I/System.out(307): waiting for debugger to settle...
5810-27 15:58:31.753: I/System.out(307): debugger has settled (1340)
5910-27 15:58:45.404: W/KeyCharacterMap(307): No keyboard for id 0
6010-27 15:58:45.414: W/KeyCharacterMap(307): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
6110-27 16:00:35.073: W/ActivityThread(334): Application bonussphere.softlevel.de is waiting for the debugger on port 8100...
6210-27 16:00:35.093: I/System.out(334): Sending WAIT chunk
6310-27 16:00:35.113: I/dalvikvm(334): Debugger is active
6410-27 16:00:35.338: I/System.out(334): Debugger has connected
6510-27 16:00:35.338: I/System.out(334): waiting for debugger to settle...
6610-27 16:00:35.543: I/System.out(334): waiting for debugger to settle...
6710-27 16:00:35.744: I/System.out(334): waiting for debugger to settle...
6810-27 16:00:36.001: I/System.out(334): waiting for debugger to settle...
6910-27 16:00:36.193: I/System.out(334): waiting for debugger to settle...
7010-27 16:00:36.459: I/System.out(334): waiting for debugger to settle...
7110-27 16:00:36.673: I/System.out(334): waiting for debugger to settle...
7210-27 16:00:36.889: I/System.out(334): waiting for debugger to settle...
7310-27 16:00:37.120: I/System.out(334): waiting for debugger to settle...
7410-27 16:00:37.337: I/System.out(334): waiting for debugger to settle...
7510-27 16:00:37.563: I/System.out(334): waiting for debugger to settle...
7610-27 16:00:37.783: I/System.out(334): waiting for debugger to settle...
7710-27 16:00:38.033: I/System.out(334): waiting for debugger to settle...
7810-27 16:00:38.253: I/System.out(334): debugger has settled (1502)
7910-27 16:01:32.476: W/KeyCharacterMap(334): No keyboard for id 0
8010-27 16:01:32.484: W/KeyCharacterMap(334): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
8110-27 16:05:39.613: W/ActivityThread(361): Application bonussphere.softlevel.de is waiting for the debugger on port 8100...
8210-27 16:05:39.633: I/System.out(361): Sending WAIT chunk
8310-27 16:05:39.643: I/dalvikvm(361): Debugger is active
8410-27 16:05:39.834: I/System.out(361): Debugger has connected
8510-27 16:05:39.834: I/System.out(361): waiting for debugger to settle...
8610-27 16:05:40.043: I/System.out(361): waiting for debugger to settle...
8710-27 16:05:40.243: I/System.out(361): waiting for debugger to settle...
8810-27 16:05:40.469: I/System.out(361): waiting for debugger to settle...
8910-27 16:05:40.663: I/System.out(361): waiting for debugger to settle...
9010-27 16:05:40.863: I/System.out(361): waiting for debugger to settle...
9110-27 16:05:41.073: I/System.out(361): waiting for debugger to settle...
9210-27 16:05:41.313: I/System.out(361): waiting for debugger to settle...
9310-27 16:05:41.518: I/System.out(361): waiting for debugger to settle...
9410-27 16:05:41.734: I/System.out(361): waiting for debugger to settle...
9510-27 16:05:41.953: I/System.out(361): debugger has settled (1400)
9610-27 16:06:55.893: W/KeyCharacterMap(361): No keyboard for id 0
9710-27 16:06:55.893: W/KeyCharacterMap(361): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

Wäre für Hilfe sehr dankbar, Christian.

— geändert am 27.10.2011, 18:09:11

Antworten