Micka
Fortgeschrittenes Mitglied
- 1
Hy,
seit langem arbeite ich ja schon an meiner Seminararbeit für die Uni, der eine oder andere dürfte das Project evtl schon kennen.
Nach meiner letzten Besprechung mit dem Prof. hieß es nun die Datenbank müsse normalisiert werden und ein DBMS soll genutzt werden.
Über die Sinnigkeit des vom Prof vorgestellten DBMS kann man sich streiten, naja egal.
Problem ist das folgende.
Ich habe eine Klasse für jede Datenbanktabelle, für die Tabelle Listen sieht diese wie folgt aus:
Die Klasse Constants, hieraus werden ja Spaltennamen genommen, sieht wie folgt aus:
Soweit so gut, in meiner Activity EintragHinzufügen möchte ich nun eine Liste eintragen, dafür gehe ich wie folgt vor.
LISTENNAME und LISTENTYP sind in Constants deklariert, alle meine Klassen implementieren Constants. listenname und listentyp sind jeweils lokale variablen.
Wenn ich das nun ausführe schmiert die APP ab und folgendes steht im LogCat:
Der ursprüngliche Beitrag von 12:32 Uhr wurde um 12:43 Uhr ergänzt:
Ich hab auch schon versucht es über die rawquery Variante zu machen wie ich es vorher hatte, aber da kommt seit der Datenbanktabellen Klasse der gleiche Fehler.
Also statt
seit langem arbeite ich ja schon an meiner Seminararbeit für die Uni, der eine oder andere dürfte das Project evtl schon kennen.
Nach meiner letzten Besprechung mit dem Prof. hieß es nun die Datenbank müsse normalisiert werden und ein DBMS soll genutzt werden.
Über die Sinnigkeit des vom Prof vorgestellten DBMS kann man sich streiten, naja egal.
Problem ist das folgende.
Ich habe eine Klasse für jede Datenbanktabelle, für die Tabelle Listen sieht diese wie folgt aus:
Code:
package de.micka.lebenshilfe;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
public class ListenDataManager extends SQLiteOpenHelper implements Constants
{
private static final String DATABASE_NAME = "de.micka.lebenshilfe.haushaltsbuchdb";
private static final int DATABASE_VERSION = 1;
/** Create a helper object for the database */
public ListenDataManager(Context ctx)
{
super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("CREATE TABLE " + LISTEN_TABLE_NAME + " ("
+ _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ LISTENNAME +" TEXT NOT NULL, "
+ LISTENTYP + " TEXT NOT NULL );"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS " + LISTEN_TABLE_NAME);
onCreate(db);
}
}
Code:
package de.micka.lebenshilfe;
import android.provider.BaseColumns;
public interface Constants extends BaseColumns
{
public static final String LISTEN_TABLE_NAME = "listen";
public static final String EINTRAEGE_TABLE_NAME = "eintraege";
// Spalten der Listen-Datenbank
public static final String LISTENNAME = "LISTENNAME";
public static final String LISTENTYP = "LISTENTYP";
// Spalten der Eintraege-Datenbank
public static final int DAY = 0;
public static final int MONTH = 0;
public static final int YEAR = 0;
public static final String CATEGORY = "kategorie";
public static final double AMOUNT = 0.00;
public static long LISTID = 0;
}
Code:
private ListenDataManager listen;
listen = new ListenDataManager(this);
SQLiteDatabase db = listen.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(LISTENNAME, listenname);
values.put(LISTENTYP, listentyp);
// Insert a new record
db.insertOrThrow(LISTEN_TABLE_NAME, null, values); //ZEILE 232 der EintragHinzufuegen.java
Wenn ich das nun ausführe schmiert die APP ab und folgendes steht im LogCat:
Kann mir jemand sagen warum es die Spalte LISTENTYP in meiner Tabelle nicht gibt? In der OnCreate des ListenDataManager wird doch genau diese tabelle angelegt.06-17 10:20:29.291: E/AndroidRuntime(365): Uncaught handler: thread main exiting due to uncaught exception
06-17 10:20:29.381: D/dalvikvm(365): GC freed 5531 objects / 331712 bytes in 82ms
06-17 10:20:29.401: E/AndroidRuntime(365): java.lang.IllegalStateException: Could not execute method of the activity
06-17 10:20:29.401: E/AndroidRuntime(365): at android.view.View$1.onClick(View.java:2031)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.view.View.performClick(View.java:2364)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.view.View.onTouchEvent(View.java:4179)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.widget.TextView.onTouchEvent(TextView.java:6541)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.view.View.dispatchTouchEvent(View.java:3709)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-17 10:20:29.401: E/AndroidRuntime(365): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
06-17 10:20:29.401: E/AndroidRuntime(365): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
06-17 10:20:29.401: E/AndroidRuntime(365): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.os.Handler.dispatchMessage(Handler.java:99)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.os.Looper.loop(Looper.java:123)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.app.ActivityThread.main(ActivityThread.java:4363)
06-17 10:20:29.401: E/AndroidRuntime(365): at java.lang.reflect.Method.invokeNative(Native Method)
06-17 10:20:29.401: E/AndroidRuntime(365): at java.lang.reflect.Method.invoke(Method.java:521)
06-17 10:20:29.401: E/AndroidRuntime(365): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
06-17 10:20:29.401: E/AndroidRuntime(365): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
06-17 10:20:29.401: E/AndroidRuntime(365): at dalvik.system.NativeStart.main(Native Method)
06-17 10:20:29.401: E/AndroidRuntime(365): Caused by: java.lang.reflect.InvocationTargetException
06-17 10:20:29.401: E/AndroidRuntime(365): at de.micka.lebenshilfe.EintragHinzufuegen.onClickEintragSpeichern(EintragHinzufuegen.java:232)
06-17 10:20:29.401: E/AndroidRuntime(365): at java.lang.reflect.Method.invokeNative(Native Method)
06-17 10:20:29.401: E/AndroidRuntime(365): at java.lang.reflect.Method.invoke(Method.java:521)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.view.View$1.onClick(View.java:2026)
06-17 10:20:29.401: E/AndroidRuntime(365): ... 22 more
06-17 10:20:29.401: E/AndroidRuntime(365): Caused by: android.database.sqlite.SQLiteException: table listen has no column named LISTENTYP: , while compiling: INSERT INTO listen(LISTENNAME, LISTENTYP) VALUES(?, ?);
06-17 10:20:29.401: E/AndroidRuntime(365): at android.database.sqlite.SQLiteProgram.native_compile(Native Method)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1027)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1413)
06-17 10:20:29.401: E/AndroidRuntime(365): at android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1308)
06-17 10:20:29.401: E/AndroidRuntime(365): ... 26 more
06-17 10:20:29.461: I/dalvikvm(365): threadid=7: reacting to signal 3
06-17 10:20:29.461: E/dalvikvm(365): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
Der ursprüngliche Beitrag von 12:32 Uhr wurde um 12:43 Uhr ergänzt:
Ich hab auch schon versucht es über die rawquery Variante zu machen wie ich es vorher hatte, aber da kommt seit der Datenbanktabellen Klasse der gleiche Fehler.
Also statt
habe ichContentValues values = new ContentValues(); values.put(LISTENNAME, listenname); values.put(LISTENTYP, listentyp); // Insert a new record db.insertOrThrow(LISTEN_TABLE_NAME, null, values); //ZEILE 232 der EintragHinzufuegen.java
versucht.db.execSQL("INSERT INTO " + LISTEN_TABLE_NAME +" (LISTENNAME, LISTENTYP) "
+"VALUES ('" + listenname + "', '" + listentyp + "');");
Zuletzt bearbeitet: