SQLite INSERT INTO > no such table

M

MBPower

Fortgeschrittenes Mitglied
11
Beim INSERT INTO in eine SQLite bekomme ich immer die folgenden Fehlermeldung.
03-11 08:01:02.447: ERROR/Database(4885): Failure 1 (no such table: test1) on 0x282de8 when preparing 'INSERT INTO test1 (name, name1, name2, name3) VALUES ('Max','Max1','Max2','Max3');'.
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();
        }
}
 
Versuch mal in dem create table Statement tatsächlich auch die Konstante für den Datenbanknamen zu verwenden ;)

Gruß,
Shini
 
hehe genau,
deine tabelle heißt MY_DB_TABLE

mach mal " IF NOT EXISTS " + MY_DB_TABLE + " lala
 
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:
03-11 09:39:33.997: ERROR/Database(5788): Failure 1 (near "test1": syntax error) on 0x281880 when preparing 'CREATE test1 IF NOT EXISTS test1 (_id integer primary key autoincrement, name varchar(20), name1 varchar(20), name2 varchar(20), name3 varchar(20)'.
 
eventuell mal vorher die sqlite referenz lesen ;)

create table if not exists TEST1 soll es heißen
 
Nach CREATE kommt nicht nochmal der Tab.name! (Glaub ich ;) )

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

Gruß,
Shini
 
MBPower schrieb:
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.

Da fehlt das TABLE nach create.

ADD: Mann seid ihr schnell hier.
 
Zuletzt bearbeitet:
Shinigami schrieb:
Edit: @swordi: übernachtest Du hier?! *g* War zu langsam...

Gruß,
Shini

hehe nö - war zufall ;)
 
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.
 
Vielen Dank Euch allen. :)
 
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.
 
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:
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
 
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:
  • Danke
Reaktionen: MBPower
@Fr4gg0r
Leider funktioniert das noch nicht so wirklich.
Es kommt die folgende Fehlermeldung
ERROR/AndroidRuntime(15711): Uncaught handler: thread main exiting due to uncaught exception
ERROR/AndroidRuntime(15711): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 9
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:
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.
 
  • Danke
Reaktionen: MBPower
Vielen Dank. Dann macht das ganze jetzt auch Sinn für mich. :)
 
MBPower schrieb:
Vielen Dank. Dann macht das ganze jetzt auch Sinn für mich. :)

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:
Fr4gg0r schrieb:
die while schleife müsste man einbauen wenn man mehrere Datenzeilen hat.
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.
 
Hast Recht!
If braucht man trotzdem nicht. :p
c.moveToFirst(); reicht.
 

Ähnliche Themen

R
Antworten
6
Aufrufe
1.011
swa00
swa00
5
Antworten
5
Aufrufe
1.208
jogimuc
J
Justice
Antworten
4
Aufrufe
1.673
Justice
Justice
Zurück
Oben Unten