sqlite-App startet nicht,Fehler im Code?

  • Antworten:4
  • Bentwortet
ECR
  • Forum-Beiträge: 72

30.07.2012, 16:15:16 via Website

Ich habe hier 3 Klassen, wobei ich eine Klasse nicht hochladen, da es sich nur um die Klasse handelt wechle das Datenobjekt halten kann.

Ich wollte eigentlich nur eine kleine Beispielapp machen. Die Idee ist es eine Tabelle zu füllen und sie dann mit der Windows CMD die erstellte Tabelle auszulesen.

Leider kann ich den Code drehen und wenden wie ich will, ich bekomme immer eine Fehlermeldung. Komischerweise erhalte ich nicht einmal das Log.d() ?

Das ist die Fehlermeldung welche ich erhalte:
107-30 13:58:57.161: I/Process(1003): Sending signal. PID: 1003 SIG: 9
207-30 14:09:36.011: I/dalvikvm(1044): threadid=3: reacting to signal 3
307-30 14:09:36.211: I/dalvikvm(1044): Wrote stack traces to '/data/anr/traces.txt'
407-30 14:09:36.261: D/dalvikvm(1044): newInstance failed: no <init>()
507-30 14:09:36.301: D/AndroidRuntime(1044): Shutting down VM
607-30 14:09:36.331: W/dalvikvm(1044): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
707-30 14:09:36.411: E/AndroidRuntime(1044): FATAL EXCEPTION: main
807-30 14:09:36.411: E/AndroidRuntime(1044): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{ch.dbtut/ch.dbtut.DBTutActivity}: java.lang.InstantiationException: can't instantiate class ch.dbtut.DBTutActivity; no empty constructor
907-30 14:09:36.411: E/AndroidRuntime(1044): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1880)
1007-30 14:09:36.411: E/AndroidRuntime(1044): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
1107-30 14:09:36.411: E/AndroidRuntime(1044): at android.app.ActivityThread.access$600(ActivityThread.java:123)
1207-30 14:09:36.411: E/AndroidRuntime(1044): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
1307-30 14:09:36.411: E/AndroidRuntime(1044): at android.os.Handler.dispatchMessage(Handler.java:99)
1407-30 14:09:36.411: E/AndroidRuntime(1044): at android.os.Looper.loop(Looper.java:137)
1507-30 14:09:36.411: E/AndroidRuntime(1044): at android.app.ActivityThread.main(ActivityThread.java:4424)
1607-30 14:09:36.411: E/AndroidRuntime(1044): at java.lang.reflect.Method.invokeNative(Native Method)
1707-30 14:09:36.411: E/AndroidRuntime(1044): at java.lang.reflect.Method.invoke(Method.java:511)
1807-30 14:09:36.411: E/AndroidRuntime(1044): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
1907-30 14:09:36.411: E/AndroidRuntime(1044): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
2007-30 14:09:36.411: E/AndroidRuntime(1044): at dalvik.system.NativeStart.main(Native Method)
2107-30 14:09:36.411: E/AndroidRuntime(1044): Caused by: java.lang.InstantiationException: can't instantiate class ch.dbtut.DBTutActivity; no empty constructor
2207-30 14:09:36.411: E/AndroidRuntime(1044): at java.lang.Class.newInstanceImpl(Native Method)
2307-30 14:09:36.411: E/AndroidRuntime(1044): at java.lang.Class.newInstance(Class.java:1319)
2407-30 14:09:36.411: E/AndroidRuntime(1044): at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
2507-30 14:09:36.411: E/AndroidRuntime(1044): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1871)
2607-30 14:09:36.411: E/AndroidRuntime(1044): ... 11 more
2707-30 14:09:36.691: I/dalvikvm(1044): threadid=3: reacting to signal 3
2807-30 14:09:36.771: I/dalvikvm(1044): Wrote stack traces to '/data/anr/traces.txt'
2907-30 14:09:37.051: I/dalvikvm(1044): threadid=3: reacting to signal 3
3007-30 14:09:37.121: I/dalvikvm(1044): Wrote stack traces to '/data/anr/traces.txt'

Sieht hier jemand einen Fehler??

Das ist die "Startklasse":
1package ch.dbtut;
2
3import android.os.Bundle;
4import android.app.Activity;
5import android.util.Log;
6import android.view.Menu;
7import android.view.MenuItem;
8import android.support.v4.app.NavUtils;
9
10public class Star extends Activity {
11
12 private Activity activity;
13
14 @Override
15 public void onCreate(Bundle savedInstanceState) {
16 super.onCreate(savedInstanceState);
17 setContentView(R.layout.main);
18 activity = this;
19 Log.d("Ich bin der TAG","StarActivity");
20
21 String sql ="CREATE TABLE testtabelle (id INTEGER PRIMARY KEY AUTOINCREMENT,start DATE,ende DATE,anzahlLektionen int,klasse VARCHAR(50), zimmername VARCHAR(50),bezeichnung VARCHAR(50));";
22
23 DBTutActivity test = new DBTutActivity(activity,"viewtabelle",sql);
24 }
25
26 @Override
27 public boolean onCreateOptionsMenu(Menu menu) {
28 getMenuInflater().inflate(R.menu.activity_star, menu);
29 return true;
30 }
31
32
33}

Und das ist die Klasse welche es dann in eine DB schreiben soll:
1package ch.dbtut;
2
3import android.app.Activity;
4import android.content.ContentValues;
5import android.content.Context;
6import android.database.sqlite.SQLiteDatabase;
7import android.database.sqlite.SQLiteDatabase.CursorFactory;
8import android.database.sqlite.SQLiteOpenHelper;
9import android.os.Bundle;
10import android.util.Log;
11import android.view.Menu;
12
13public class DBTutActivity extends SQLiteOpenHelper {
14
15 // bietet Methoden Verwalten einer SQLite-Datenbank. Dazu gehören das
16 // Erstellen und Löschen von Datenbanken und Tabellen, sowie das Ausführen
17 // von SQLAnweisungen.
18 private SQLiteDatabase myDB;
19 private String dBTabelle;
20 private String tabellenSQL;
21
22
23 public DBTutActivity(Context activity, String dbName, String sql) {
24
25 super(activity, dbName, null, 1);
26 Log.d("Konstruktur","Ich bin im Konstruktor");
27
28 this.tabellenSQL = sql.toUpperCase();
29
30 // onCreate(myDB );
31 this.myDB = getWritableDatabase();
32 DatensatzStpl ds = new DatensatzStpl(1232, 12345, 5, "IT-0912", "202",
33 "Progammierung");
34
35 datenSatzErstellen(ds);
36
37 }
38
39 @Override
40 public synchronized void close() {
41 // TODO Auto-generated method stub
42 if (myDB != null) {
43 myDB.close();
44 myDB = null;
45 }
46 super.close();
47 }
48
49 @Override
50 public void onCreate(SQLiteDatabase db) {
51 try {
52 myDB.execSQL(tabellenSQL);
53 Log.d("carpelibrum", "datenbank wird angelegt");
54 } catch (Exception ex) {
55 Log.e("carpediam", ex.getMessage());
56 }
57
58 }
59
60 @Override
61 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
62 // TODO Auto-generated method stub
63
64 }
65
66 public long datenSatzErstellen(DatensatzStpl ds) {
67
68 ContentValues daten = new ContentValues();
69 daten.put("start", ds.start);
70 daten.put("ende", ds.ende);
71 daten.put("anzahlLektionen", ds.anzahlLektionen);
72 daten.put("klasse", ds.klasse);
73 daten.put("zimmername", ds.zimmername);
74 daten.put("bezeichnung", ds.bezeichnung);
75
76 return myDB.insert(dBTabelle, null, daten);
77
78 }
79}

Antworten
André
  • Forum-Beiträge: 77

30.07.2012, 16:37:22 via Website

Das steht doch ziemlich deutlich im Logcat...

07-30 14:09:36.411: E/AndroidRuntime(1044): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{ch.dbtut/ch.dbtut.DBTutActivity}: java.lang.InstantiationException: can't instantiate class ch.dbtut.DBTutActivity; no empty constructor

Hast du im Manifest die Activity Klasse richtig angegeben?

Antworten
ECR
  • Forum-Beiträge: 72

30.07.2012, 21:32:57 via Website

Ähm also wenn man ehrlich sind steht es überhaupt nicht deutlich in der Logcat :-) Es wird mit keinem Wort erwähnt die Manifest oder sonst was erwähnt.

Ich habe nun ein Update gmacht auf Revision 20.0.01, ein neues Projekt angelegt und komischerweise startet es jetzt. So wie es jetzt aussieht habe ich eine Fehler mit der DB selber.

Muss ich die onCreate Methode im Konstruktor aufrufen damit die DB überhaupt erstellt wird? Ich Internet habe ich gelesen das die onCreate Methode selber aufgerufen wird wenn es keine DB gibt? Stimmt das?

Das ist nämlich nun der neue Fehler:

107-30 19:31:10.942: E/AndroidRuntime(568): FATAL EXCEPTION: main
207-30 19:31:10.942: E/AndroidRuntime(568): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test8/com.example.test8.MainActivity}: java.lang.NullPointerException: println needs a message
307-30 19:31:10.942: E/AndroidRuntime(568): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)

Antworten
Markus B.
  • Forum-Beiträge: 636

30.07.2012, 23:34:28 via Website

Hi, der erste Fehler hat nichts mit der manifest.xml zutun...
Ich kann dir keine explizite Begründung geben warum es so gemacht werden muss aber wie folgt wird es in den Google Samples immer gemacht:

1public DatabaseHelper(Context context) {
2 super(context, AccountManagerService.getDatabaseName(), null, DATABASE_VERSION);
3}

Du musst also einen Konstruktor erstellen, welcher nur einen Context entgegen nimmt und diesen dann über statische Methode und/oder Variablen füttern. Dann hast du keine Probleme mehr.
Warum das im Detail an der Stelle so ist kann ich noch nicht sagen. Ich wühle schon ein Weile in den Android sourcen rum aber ich finde den Grund nicht ...

Gruß,
Markus

— geändert am 30.07.2012, 23:35:38

Antworten
ECR
  • Forum-Beiträge: 72

31.07.2012, 13:36:12 via Website

He Danke für den Anstoss Markus,

Ich habe nach diesem static gegoogelt in Verbindung mit den sqlite Datenbanken. Ich bin dann auf ein Beispiel von Vogella gestossen:

http://www.vogella.com/articles/AndroidSQLite/article.html

Dort sieht man auch wie das mit dem static funktioniert.

Antworten