SQLite Tabelle in app erstellen

M

Madin3

Neues Mitglied
0
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:

Code:
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";

    private static final String TABLE_TODO = "nocheinetodos";
    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);";

    private static final String CREATE_TABLE_TODO = "CREATE TABLE "
            + TABLE_TODO + "(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);
            db.execSQL(CREATE_TABLE_TODO);
      //  } 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;
    }
   

}
 
Hallo Martin ,

in deinem Code hast du

private static final String

Warum ist dieser "static final" also nicht veränderbar = Konstante und wann setzt du diesen ein ?

lg
Stefan
[doublepost=1472755858,1472755614][/doublepost]P.S mach mit Pascal bitte weiter ......
 
swa00 schrieb:
Hallo Martin ,

in deinem Code hast du

private static final String

Warum ist dieser "static final" also nicht veränderbar = Konstante und wann setzt du diesen ein ?

lg
Stefan
[doublepost=1472755858,1472755614][/doublepost]P.S mach mit Pascal bitte weiter ......

Sicherlich weil es in (so gut wie) jedem Tutorial gesagt wird das man es so machen soll ;-)

Spaß beiseite, warum sollten es keine Konstanten sein? Das sind alles Parameter, die normalerweise nicht Veränderbar sein sollten.

@Madin3, wenn der Benutzer durch seine Eingabe die Tabelle bestimmen kann, kann man mit einer sehr hohen Wahrscheinlichkeit davon ausgehen das die Tabelle noch nicht existiert, ergo musst du schauen ob sie existiert und ggf. anlegen.

Du musst stehts sicher gehen, das die Tabellen existieren, wenn sie nicht vorhanden ist, kann in ihr auch nichts rein geschrieben werden.
 
Ich weiß zwar, das es technisch funkioniert, aber kann mir jemand sagen, warum man dynamische Tabellen erstellen sollte?

Ich sehe irgendwie keinen Sinn drin. Man kann doch auch alles in eine Tabelle stecken und dann fremdverknüpfen etc.
 
Danke schon mal für eure Antworten, ich habe erst vor 4 Wochen mit dem Programmieren angefangen und den SQLite teil habe ich größtenteils aus tutorials übernommen.
Da wir aneinander vorbeireden erkläre ich jetzt einfach mal was ich eigentlich programmieren will.
Es soll ein Schulaufgabenplaner werden in dem ein Datum, Fach, Lehrer Name, ein Typ und eine Farbe eingetragen werden kann. Ich dachte mir das ganze speichere ich jetzt in eine SQLite Datenbank und Synchronisiere das dann Später mit einem Server (wie weiß ich noch nicht).
Die Eintragungen Kann nur ein Lehrer vornehmen (Schreib und Leserechte) und Schüler können nur abfragen (Leserechte).
Ich dachte mir dann einfach das der Lehrer in der App eine Schulaufgabe einträgt mit den oben genannten Daten, zusätzlich kann er auch in der App selbst eine Schulkasse anlegen, da ich ja vorher die Schulklassen nicht kenne,und jede Schulklasse, so dachte ich mir, ist eine eigene Tabelle in der Datenbank.
Und dieses anlegen der Schulklassen bekomme ich aus der App heraus nicht hin.

Ich möchte quasi ein Textfeld in dem man einem Namen einträgt und einen Button der bei klick eine neue Tabelle in meiner Datenbank mit den eingegebenen Namen anlegt.
 
Hi, jeder fängt mal irgendwann an und muss sich das Wissen aneignen.
Leider fehlt dir das Wissen über das Wording bei relationalen Datenbanken. Dieses würde ich dir gerne beibringen, aber in einem Forum ist das nicht so einfach.

Für deinen Fall brauchst du keine neuen Tabellen, sondern neue Einträge in einer Tabelle.
Du hast ja schon eine Tabelle mit den Spalten Datum, Fach, Lehrer Name etc.
Jetzt benötigst du noch eine Tabelle mit den verschiedenen Schulklassen. (Schulklassen Name, Raum Nummer, etc)

Über die ID der Klasse kannst du dann in deiner ersten Tabelle die Schulklasse verknüpfen.
D.h.: Du schreibst die ID der Klasse an deine erste Tabelle.

Beispiel:
Klasse 10a: ID = 1, Schulkassenname = 10a, Raum = 3.2.1
Klasse 10b: ID = 2, Schulklassenname = 10b, Raum = 3.4.1

In der ersten Tabelle gibt es jetzt eine Verknüpfung mit der Klasse.
ID = 1, Datum = 20160902, Fach = Mathe, LehrerName = Müller, KlassenID = 1
ID = 2, Datum = 20160902, Fach = Deutsch, LehrerName = Maier, KlassenID = 1
ID = 3, Datum = 20160902, Fach = Mathe, LehrerName = Müller, KlassenID = 2

Jetzt kann man erkennen, dass der Lehrer Müller Mathe lehrt und in den Klassen 10a und 10b unterrichtet. Und der Lehrer Maier nur in der Klasse 10a Deutsch unterrichtet.

Das ist eine Verknüpfung von Tabellen. Das sollte eigentlich auf den Seiten stehen, die die Grundlagen einer relationalen Datenbank behandeln.
Wenn du tiefer in die Materie einsteigen willst, empfehle ich dir nach der "dritten Normalform" (3NF) zu googlen und es dir duchzulesen.

Ich hoffe, ich konnte dir weiterhelfen.
 
So ich hab mich etwas Informiert und meine Datenbank würde ich nun wie auf dem Bild aufbauen.

Diese "Verbindungstabellen" erstelle ich momentan im Programm wenn z.b. eine Schulklasse in einem Spinner Objekt ausgewählt worden ist und dann noch ein neuer Lehrer hinzugefügt wird,
indem ich in den Tabellen "TABLE_SCHOOL_CLASS" und "TABLE_TEACHER_NAME" nach den namen der Schulklasse und Lehrer durchsuche, mir die id der entsprechenden Reihe herausziehe, um sie dann in der Tabelle "TABLE_SCHOOL_CLASS_TEACHER" eintragen zu können.
Macht man das so oder gibt es dafür Spezielle SQLite Befehle?

2. Frage
Ich habe die Tabelle "TABLE_SCHOOL_CLASS" mit 10 Einträgen gefüllt und lösche jetzt den eintrag mit der ID 5, dann fehlt ja in meiner Tabelle die id 5 und der nächste Eintrag in die Tabelle würde mit der ID 11 fortgesetzt.
Kann man das so belassen oder sollte man die Tabelle dann "Updaten" damit keine fehlenden ID Einträge enthalten sind?
 

Anhänge

  • Tabellen.PNG
    Tabellen.PNG
    11,8 KB · Aufrufe: 169
Zur 1. Frage: Ja, so kann man es machen. Natürlich könntest du direkt die _id in deinen Objekten vorhalten, so müsstest du nicht noch die Tabellen durchsuchen, sondern hättest direkt die benötigte id.

Zur 2. Frage: Nein, man sollte es nicht "Updaten". So wie du es machst ist es gut. In anderen SQL-Datenbanken wird mehr auf "Autoincrement" geschaut als bei SQLite, deswegen ist es schon gut, wenn du dich gleich da dran gewöhnst.

Allgemein: Dein Klassendiagramm / Datenbankschema finde ich gut. Zwar könnte man noch eine kleine Sache "verbessern", aber so ist es gut.
Du solltest leider immer noch an deinem Wording arbeiten.
Diese "Verbindungstabellen" erstelle ich momentan
Du erstellst keine Tabellen, sondern füllst die Tabelle mit Einträgen / Zeilen. (Wenn ich es richtig sehe)
 

Ähnliche Themen

R
Antworten
6
Aufrufe
982
swa00
swa00
W
Antworten
2
Aufrufe
719
rene3006
R
Zurück
Oben Unten