SQLite Tabelle in app erstellen

  • Antworten:6
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 4

01.09.2016 19:25:13 via Website

Hallo,
ich stehe vor folgendem Problem.

Ich möchte eine SQLite Tabelle bestehend aus 6 spalten erstellen diese bestehen aus Benutzereingaben (Strings, Datum und Integer) , das klappt auch soweit ganz gut solange ich den TABLE_NAME vorab im Programm festlege.

Wie gehe ich aber vor wenn ich auch den TABLE_NAME vorab durch eine Benutzereingabe abfrage, sagen wir einmal gibt der Benutzer TABLE_NAME A1 ein und ein anderes mal EME12.

Wenn das erste mal eine Tabelle erstellt wird mit der oben genannten A1 funktioniert das ganze auch, doch sobald ich einen anderen Tabellenname eingeben bekomme ich eine exception.

Error inserting Color=Hellblau Date=September 25 TeacherName= Subject=dd Typ=1
android.database.sqlite.SQLiteException: no such table: nocheinetodos (code 1): , while compiling: INSERT INTO nocheinetodos(Color,Date,TeacherName,Subject,Typ) VALUES (?,?,?,?,?)

Hier mal noch mein code:

enter code here

package de.madin.mssdadas;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class SQLite extends SQLiteOpenHelper {

private static final String LOG_TAG = SQLite.class.getSimpleName();

public static final int DATABASE_VERSION = 1;

public static final String DATABASE_NAME = "Schulaufgabenplaner";

public String TABLE_NAME = "Klasse";

public static final String COL_1 = "_id";
public static final String COL_2 = "Date";
public static final String COL_3 = "Subject";
public static final String COL_4 = "TeacherName";
public static final String COL_5 = "Typ";
public static final String COL_6 = "Color";

public String SQL_CREATE =
        "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, Date DATE, Subject TEXT, TeacherName TEXT, Typ INTEGER, Color TEXT);";


public SQLite(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        Log.d(LOG_TAG, "Die Tabelle wird mit SQL-Befehl: " + SQL_CREATE + " angelegt.");
        db.execSQL(SQL_CREATE);
    } catch (Exception ex) {
        Log.e(LOG_TAG, "Fehler beim Anlegen der Tabelle: " + ex.getMessage());
    }
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

public boolean setData(String sclass, String subject, String teacher, String color, String date, int typ) {
    SQLiteDatabase db = this.getReadableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put(COL_2, date);
    contentValues.put(COL_3, subject);
    contentValues.put(COL_4, teacher);
    contentValues.put(COL_5, typ);
    contentValues.put(COL_6, color);

    long result = db.insert(TABLE_NAME, null, contentValues);
    if (result == -1)
        return false;
    else
        return true;
}

}

— geändert am 01.09.2016 21:09:02

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.319

01.09.2016 19:54:16 via Website

Bist du dir sicher, dass die onCreate ausgeführt wurde?
Du könntest ja mal ein Select über alle existierenden Tabellen macht mit z.b. SHOW tables o.ä.

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 4

01.09.2016 20:37:02 via Website

Ja die onCreate wird ausgeführt von einer anderen Klasse aus, ich habe nicht den kompletten code hier rein kopiert.
Ich habe die Datenbank auch schon mit einem dem Firefox addon SQLite Manger ausgelesen und solange es nur eine Tabelle ist wird diese auch richtig erstellt.

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.319

01.09.2016 20:42:52 via App

Warum hast du das try/catch bein onCreate weg gemacht. würde dir evntl den fehler zeigen..

Ansonsten mal eine .db datei erstellen und mauell kopieren und schauen was passiert

ps: bei der 2. create table query fehlt auch ein leerzeichen nach dem Namen, daran liegt es wahrscheinlich

— geändert am 01.09.2016 20:44:10

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 4

01.09.2016 21:07:36 via Website

Der code ist so lauffähig das einzige was ich jetzt noch machen möchte ist public String TABLE_NAME = "Klasse"; per Benutzereingabe dynamische variieren lassen. Aber sobald das die erste Tabelle auf einem Gerät angelegt wurde akzeptiert der code nur noch den TABLE_NAME "Klasse".

Selbst wenn ich den String "Klasse" im Programm selbst nachträglich abändere bekomme ich eine exception. Der try catch greift in diesen Fall nicht der Fehler passiert irgendwo davor oder danach.

EDIT: Ich habe den oberen code nochmal etwas entschlackt da waren teilweise Dinge drin die ich zum testen hergenommen habe.

— geändert am 01.09.2016 21:10:02

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.319

01.09.2016 21:25:37 via Website

Leider gerade keine ahung..
Die tabelle esistiert wohl nicht...

Aber das macht men eh nicht so, man lässt den Benutzer keine Tabellennamen wählen, denn dann musst du ja dynamisch bei selects etc. immer aus dem speicher den DB Namen lesen.
Spätestens, wenn du später in einem Update mal ein Feld hinzufügen willst, fällst du mit einer dynamisch erzeugten DB auf die Nase

LG Pascal //It's not a bug, it's a feature. :) ;)