1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

SQLite INSERT INTO > no such table

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von MBPower, 11.03.2010.

  1. MBPower, 11.03.2010 #1
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    Beim INSERT INTO in eine SQLite bekomme ich immer die folgenden Fehlermeldung.
    Ich habe jetzt schon mehrere Stunden in google gesucht, aber leider keine Lösung gefunden.
    Beim erstellen der Datenbank gibt es keine Fehlermeldung.

    Code:
    final static String MY_DB_NAME = "test1Db";
    final static String MY_DB_TABLE = "test1";
    
    Code:
    private void onCreateDBAndDBTabled()
        {
            SQLiteDatabase myDB = null;
            
            try {
            
                myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);
    
                myDB.execSQL("CREATE TABLE IF NOT EXISTS MY_DB_TABLE" +
                         " (_id integer primary key autoincrement, " +
                           "name varchar(20), " +
                           "name1 varchar(20), " +
                           "name2 varchar(20), " +
                           "name3 varchar(20))"
                    +";");
                
                myDB.execSQL("INSERT INTO " + MY_DB_TABLE + " (name, name1, name2, name3) VALUES ('Max','Max1','Max2','Max3');");
    
            } finally {
                 if (myDB != null)
                      myDB.close();
            }
    }
    
     
  2. Shinigami, 11.03.2010 #2
    Shinigami

    Shinigami Fortgeschrittenes Mitglied

    Beiträge:
    436
    Erhaltene Danke:
    69
    Registriert seit:
    08.04.2009
    Versuch mal in dem create table Statement tatsächlich auch die Konstante für den Datenbanknamen zu verwenden ;)

    Gruß,
    Shini
     
  3. swordi, 11.03.2010 #3
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    hehe genau,
    deine tabelle heißt MY_DB_TABLE

    mach mal " IF NOT EXISTS " + MY_DB_TABLE + " lala
     
  4. MBPower, 11.03.2010 #4
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    Danke Euch. Das habe ich echt nicht gesehen.....voll Blind.

    Jetzt habe ich den Code geändert, aber es gibt immer noch eine Fehlermeldung.
    Wahrscheinlich auch wieder ein total dummer Fehler, aber leider kann ich da nichts falsches erkennen.

    Code:
    myDB.execSQL("CREATE " + MY_DB_TABLE + " IF NOT EXISTS " + MY_DB_TABLE +
                        " (_id integer primary key autoincrement, " +
                          "name varchar(20), " +
                          "name1 varchar(20), " +
                          "name2 varchar(20), " +
                          "name3 varchar(20))"
    +";");
    

    Fehlermeldung:
     
  5. swordi, 11.03.2010 #5
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    eventuell mal vorher die sqlite referenz lesen ;)

    create table if not exists TEST1 soll es heißen
     
  6. Shinigami, 11.03.2010 #6
    Shinigami

    Shinigami Fortgeschrittenes Mitglied

    Beiträge:
    436
    Erhaltene Danke:
    69
    Registriert seit:
    08.04.2009
    Nach CREATE kommt nicht nochmal der Tab.name! (Glaub ich ;) )

    Edit: @swordi: übernachtest Du hier?! *g* War zu langsam...

    Gruß,
    Shini
     
  7. DieGoldeneMitte, 11.03.2010 #7
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Da fehlt das TABLE nach create.

    ADD: Mann seid ihr schnell hier.
     
    Zuletzt bearbeitet: 11.03.2010
  8. swordi, 11.03.2010 #8
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    hehe nö - war zufall ;)
     
  9. Mort, 11.03.2010 #9
    Mort

    Mort Android-Lexikon

    Beiträge:
    960
    Erhaltene Danke:
    262
    Registriert seit:
    16.11.2009
    Noch ein Tipp am Rande: Schau dir mal SQLiteOpenHelper an (ist 'ne Basisklasse für eigene Ableitungen). Damit kann man sich v.a. bei Updates einiges leichter machen.
     
  10. MBPower, 11.03.2010 #10
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    Vielen Dank Euch allen. :)
     
  11. swordi, 11.03.2010 #11
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    auch wenn es hier so schnell geht, kann es nicht schaden, sich auch selbst ein wenig in die thematik einzulesen. die sqlite referenz ist etwas sehr grundlegendes.
     
  12. MBPower, 11.03.2010 #12
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    MySQL in PHP ist ein kinderspiel im Gegensatz zu SQLite in Android.
    Wieder einige Stunden gelesen und verschiedene Codeschnipsel getestet, aber die sind fast alle MEGA kompliziert. In PHP benötigt man 5 Zeilen zum auslesen einer MySQL Datenbank, in SQLite und Android scheint das ganze um einiges komplizierter.
    Ich möchte meine Daten, die ich jetzt wahrscheinlich in die Datenbank eintragen kann, einfach alle aufrufen.
    Für mich wäre auch OK, wenn es SELECT * FROM test1 ist.

    Bei dem folgenden Code wird eine SQL String gefunden, aber leider nicht ausgegeben.
    Code:
        SQLiteDatabase myDB = null;
        myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);
        
        Cursor c = myDB.rawQuery("SELECT _id, name, name1, name2, name3 FROM " + "test1"
                + ";", null);        
        startManagingCursor(c); 
        
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1, c,
                new String[] { "_id" },
                new int[] { android.R.id.text1 });
    
        adapter.setViewBinder(new ViewBinder() {
            
            @Override
            public boolean setViewValue(View view, Cursor theCursor, int column) {
                
                String aColumnString = theCursor.getString(1);
                String bColumnString = theCursor.getString(2);
                txtTest.setText(aColumnString + "," + bColumnString);
                
                return true;
            }
        });
    
     
    Zuletzt bearbeitet: 12.03.2010
  13. swordi, 11.03.2010 #13
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    hmm... erstmals android arbeitet mit java und java ist eine programmiersprache - php tut nur so als ob ;) von daher muss man mit einigen konzepten erstmal klarkommen

    also ich hab nie einen cursor adapter benutzt, von daher kann ich auf die schnelle nur vermutungen anstellen:

    du hast einen viewbinder. der gibt dir cursor und die spalte

    ich denke mal du musst dann auch die werte der spalte irgendwie mit einbeziehen.

    aber wie gesagt, nur vermutungen
     
  14. Fr4gg0r, 11.03.2010 #14
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Wie wärs mit:

    Code:
        Cursor c = myDB.rawQuery("SELECT _id, name, name1, name2, name3 FROM " + "test1"
                + ";", null);        
        startManagingCursor(c); 
     id = c.getInt(c.getColumnIndex("_id"));
    name = c.getString(c.getColumnIndex("name"));
    ...
    
     
    Zuletzt bearbeitet: 11.03.2010
    MBPower bedankt sich.
  15. MBPower, 12.03.2010 #15
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    @Fr4gg0r
    Leider funktioniert das noch nicht so wirklich.
    Es kommt die folgende Fehlermeldung
    Code:
    SQLiteDatabase myDB = null;
    String name, name1, name2, name3;
    int id;
    myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);
    Cursor c = myDB.rawQuery("SELECT _id, name, name1, name2, name3 FROM " + "test1"
                + ";", null);        
    startManagingCursor(c); 
    id = c.getInt(c.getColumnIndex("_id"));
    name = c.getString(c.getColumnIndex("name"));
    name1 = c.getString(c.getColumnIndex("name1"));
    name2 = c.getString(c.getColumnIndex("name2"));
    name3 = c.getString(c.getColumnIndex("name3"));
    
    Was ich auch noch überhaupt nicht verstehe ist, wie ich alle Daten auslesen kann. In PHP kann man das mit while machen, aber was genau der Cursor da macht bzw. machen soll ist mir nicht verständlich.

    @swordi
    Mir ist zur Zeit eigentlich total egal wie ich die Daten wieder aus der Datenbank bekomme. Es soll vorerst nur so einfach wie möglich sein.
     
    Zuletzt bearbeitet: 12.03.2010
  16. Mort, 12.03.2010 #16
    Mort

    Mort Android-Lexikon

    Beiträge:
    960
    Erhaltene Danke:
    262
    Registriert seit:
    16.11.2009
    Genau das while fehlt bei dir. Versuchs doch mal mit einem
    while ( c.moveToNext() ) {
    id = ...;
    }
    bzw., wenns nur ein Datensatz sein kann, auch mal if statt while.
    Und bitte hinterher c.close() nicht vergessen.
     
    MBPower bedankt sich.
  17. MBPower, 12.03.2010 #17
    MBPower

    MBPower Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    149
    Erhaltene Danke:
    9
    Registriert seit:
    26.02.2010
    Vielen Dank. Dann macht das ganze jetzt auch Sinn für mich. :)
     
  18. Fr4gg0r, 12.03.2010 #18
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    funktionierts denn?
    Meine Lösung sollte gehen, funktioniert zumindest bei mir.

    @swordi:
    da er startManagingCursor aufruft, sollte c doch automatich mit db.close(); mitgeschlossen werden. //ups hierbei wird der Cursor erst deaktivert, wenn die Activity beendet wird!
    (Wahrscheinlich meintest du auch db.close(); oder?);
    die while schleife müsste man einbauen wenn man mehrere Datenzeilen hat.
    Dann müsste man das aber auch in ein Array speichern...

    @Fehlermeldung
    Er sagt ja, Index von -1 angefordert.
    Das heißt, er hat die Spalte nicht gefunden.
    Das heißt, entweder ist der Name in getColumnIndex falsch, oder die Spalte existiert so nicht...
    Glaubt man manchmal nicht, hatte ich nämlich auch.
    Manchmal hilft es auch die Datenbank zu löschen, denn die wird beim Aufspielen einer neuen Version nicht gelöscht.

    Also bei mehreren Zeilen würd ich vorschlagen:
    Code:
    for(int i=0; i<c.getCount(); i++){  //getCound() liefert die Anzahl der Zeilen
    name[i]=c.getString(c.getColumnIndex("name"));
    c.moveToNext();
    
    
     
    Zuletzt bearbeitet: 12.03.2010
  19. Mort, 12.03.2010 #19
    Mort

    Mort Android-Lexikon

    Beiträge:
    960
    Erhaltene Danke:
    262
    Registriert seit:
    16.11.2009
    Ansonsten muss aber wenigstens ein if gemacht werden, ansonsten steht der Cursor nämlich vor dem ersten Datensatz - was vermutlich auch die Fehlermeldung verursacht. Bei den Spaltennamen ist mir jedenfalls nichts aufgefallen.
     
  20. Fr4gg0r, 12.03.2010 #20
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Hast Recht!
    If braucht man trotzdem nicht. :p
    c.moveToFirst(); reicht.
     

Diese Seite empfehlen