SQLiteOpenHelper.onCreate() führt keine Befehle aus?

L

lord_fritte

Erfahrenes Mitglied
7
Hallo, ich habe einen Datenbank-Helfer von der SQLiteOpenHelper abgeleitet und möchte in der onCreate() Funktion die Datenbank erstellen lassen.
Dazu führe ich in der onCreate(), mittels, rawQuery(), "create table" statements aus.
Diese statements scheint er aber ganz zu ignorieren, die Datenbankdatei wird zwar angelegt, aber es befinden sich keine Tabellen darin.

Ich habe in den Kopf der onCreate einen breakpoint gesetzt und bin mit dem Debugger durchgelaufen, die function wird aufgerufen und alle rawQuery aufrufe werden durchlaufen.

PHP:
public final class Database extends SQLiteOpenHelper {
    public Database(Context context) {
        super(context, "Database.db", null, 100);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.rawQuery("create table if not exists Konten( " +
                "idKonto integer primary key autoincrement, " +
                "name varchar(15) not null, " +
                "kontoTyp int not null default 0, " +
                "startWert float not null default 0, " + 
                "created long not null default current_timestamp, " +
                "changed long not null default current_timestamp, " +
                "isDeleted int not null default 0, " +
                "constraint u_konto_name unique(name));", null);
//.... usw.
 
lord_fritte schrieb:
Hallo, ich habe einen Datenbank-Helfer von der SQLiteOpenHelper abgeleitet und möchte in der onCreate() Funktion die Datenbank erstellen lassen.
Dazu führe ich in der onCreate(), mittels, rawQuery(), "create table" statements aus.
Diese statements scheint er aber ganz zu ignorieren, die Datenbankdatei wird zwar angelegt, aber es befinden sich keine Tabellen darin.

Ich habe in den Kopf der onCreate einen breakpoint gesetzt und bin mit dem Debugger durchgelaufen, die function wird aufgerufen und alle rawQuery aufrufe werden durchlaufen.

PHP:
public final class Database extends SQLiteOpenHelper {
    public Database(Context context) {
        super(context, "Database.db", null, 100);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.rawQuery("create table if not exists Konten( " +
                "idKonto integer primary key autoincrement, " +
                "name varchar(15) not null, " +
                "kontoTyp int not null default 0, " +
                "startWert float not null default 0, " + 
                "created long not null default current_timestamp, " +
                "changed long not null default current_timestamp, " +
                "isDeleted int not null default 0, " +
                "constraint u_konto_name unique(name));", null);
//.... usw.

Ich begegne in einem anderen Zusammenhang ein ähnliches Problem, da werdern INSERT und UPDATE Queries mittels db.rawQuery() nicht ausgeführt. Werde jetzt alternative Query Methoden ausprobieren. Bisher hab ich rawQuery("sqlString") bevorzugt, weil ich das SQL - Statement zwecks SQL debuggen einfach in SQLite Expert kopieren kann und exekutieren um zu sehen, ob das SQL Statement korrekt. Das geht bei den Methoden leider nicht. Möglicherweise gibt es da Einschränkungen bez. der Statements die man mit rawQuery exekutiere kann. In der Doku steht leider nix dazu drin.
 
mradlmaier schrieb:
Ich begegne in einem anderen Zusammenhang ein ähnliches Problem, da werdern INSERT und UPDATE Queries mittels db.rawQuery() nicht ausgeführt. Werde jetzt alternative Query Methoden ausprobieren. Bisher hab ich rawQuery("sqlString") bevorzugt, weil ich das SQL - Statement zwecks SQL debuggen einfach in SQLite Expert kopieren kann und exekutieren um zu sehen, ob das SQL Statement korrekt. Das geht bei den Methoden leider nicht. Möglicherweise gibt es da Einschränkungen bez. der Statements die man mit rawQuery exekutiere kann. In der Doku steht leider nix dazu drin.

Alternativ gibt es die QuickConnect DataAccess Library quickconnectfamily. Die ist unter der BSD Lizenz und stellt eine super einfache API für SQLite Datenbankanbindung zur Verfügung.
Mit einer Einschränkung: die Methoden benötigen als zusätzlichen Parameter eine Activity (Ich ermute um den Lebenszyklus des DataAccessObjects and die Activity zu binden, und so DB-Leaks zu unterbinden). Damit ist man bei Homescreen Widgets vermutlich out-of-luck...
 
mradlmaier schrieb:
Alternativ gibt es die QuickConnect DataAccess Library quickconnectfamily. Die ist unter der BSD Lizenz und stellt eine super einfache API für SQLite Datenbankanbindung zur Verfügung.
Mit einer Einschränkung: die Methoden benötigen als zusätzlichen Parameter eine Activity (Ich ermute um den Lebenszyklus des DataAccessObjects and die Activity zu binden, und so DB-Leaks zu unterbinden). Damit ist man bei Homescreen Widgets vermutlich out-of-luck...

Hab in meinem Falle db.rawQuery() durch db.insert() ersetzt. Danach hat es funktioniert. Guck mal in deiner, welche Methode deinen db.rawQuery() in ersetzen könnte. Tippe mal auf db.execSQL() oder so. Schade dass es mit db.rawQuery() Probleme gibt, fand das immer praktisch, dass man da genau weiss, wie exakt das SQL-Statement aussieht.
 
Ich bin gestern über ein ähnliches Problem bei ALTER TABLE gestossen, bis ich in der Beschreibung gesehen habe, daß rawQuery() nur verwendet wird, wenn die Abfrage ein Ergebnis zurückliefert. Für CREATE TABLE, ALTER TABLE usw. muß man execSQL() verwenden.

Und man kann NICHT mehrere SQL-Statements mittels ; trennen, man muß für jedes einzelne Kommando eine Abfrage absetzen.
 

Ähnliche Themen

R
  • Robby1950
2
Antworten
23
Aufrufe
1.005
Robby1950
R
5
Antworten
22
Aufrufe
1.415
590239
5
B
Antworten
6
Aufrufe
1.049
jogimuc
J
Zurück
Oben Unten