SQLite "Create Table" funktioniert nicht?

  • Antworten:8
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 38

30.08.2017, 10:28:25 via Website

Moin zusammen,

ich bin noch ganz neu hier und programmiere auch noch nicht lange mit Android Studio. Ich hoffe ihr helft mir trotzdem weiter. :-)

Um mich mal ein bisschen mehr mit SQL zu beschäftigen wollte ich so etwas wie ein Chatfenster machen, mit dem ich eine SQLite Datenbank benutzen kann. Ich habe eine relativ einfache Activity erstellt, die Kommunikation mit der Datenbank scheint auch zu funktionieren, aber anscheinend wird keine Datenbank erstellt.
Ich führe z.B. create table hallo(id integer primary key,name text) aus. Das scheint zu funktionieren, denn es verursacht keine Exception. Wenn ich danach aber insert into table hallo(1,'holger') oder auch nur select * from hallo ausführe, bekomme ich immer diesen Fehler:
"no such table hallo (code 1): ,
Woran liegt das?
Und wo ich gerade dabei bin: Geben Befehle wie "create table" auch irgendwas brauchbares zurück und ich frage den Cursor nur falsch ab?

package rsdevstudio.sqlite_chat;

...

public class MainActivity extends AppCompatActivity {

...

private Integer DATABASEVERSION=1;
private String DATABASENAME="DataBaseC";

...

private class DBHandler extends SQLiteOpenHelper{

    public DBHandler(Context context) {
        super(context,DATABASENAME,null,DATABASEVERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {}

    @Override
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) {}

    public Cursor exec(String command) {
        Cursor answer;
        SQLiteDatabase db=this.getReadableDatabase();
        answer=db.rawQuery(command,null);
        db.close();
        return(answer);
    }
}
DBHandler myDataBase=new DBHandler(this);

private class Bubble { ... }

@Override
protected void onCreate(Bundle savedInstanceState) { ... }

private void SendClick() {
    Integer i1;
    String str="";

    try {
        Cursor cursor=myDataBase.exec(edInput.getText().toString());
        i1=cursor.getColumnCount();
        if(i1>0) {
            cursor.moveToFirst();
            str=cursor.getString(0);
        }
    }
    catch(Exception e) {
        str=e.getMessage();
    }

    new Bubble(this,edInput.getText().toString(),SENDER_USER);
    if(str.length()>0) new Bubble(this,str,SENDER_MACHINE);

    ScrollView1.post(new Runnable() { public void run() { ScrollView1.fullScroll(ScrollView.FOCUS_DOWN); }});
    edInput.setText("");
}

}

Antworten
  • Forum-Beiträge: 2.902

30.08.2017, 10:35:49 via Website

Hallo Robert,

a) dein Create Table ist nicht vollständig

Bsp

public static final String TABLE_NAME   = "settings";
public static final String COLUMN_NAME  = "name";
public static final String COLUMN_VALUE = "value";
public static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " +
        TABLE_NAME + " (" +
        _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
        COLUMN_NAME + " TEXT, " +
        COLUMN_VALUE + " TEXT " + ")";

b) und deine Cursor Abfrage ist auch ein wenig "gewöhnungsbedürftig" und sollte auch nicht unbedingt
in den Helper rein

 Cursor c = database.rawQuery("SELECT * FROM  settings  where name = '" + key + "'", null);
if (c != null)
{
  if (c.moveToFirst())
  {
   id = c.getInt(c.getColumnIndex("_id"));
   str_result = c.getString(c.getColumnIndex("value"));
 } 
}
database.close();

c) Dann fehlt mir bei deinem Source das try / catch Exception-Handling

— geändert am 30.08.2017, 10:54:17

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 2.902

30.08.2017, 10:56:50 via Website

@Ludy

ich danke Dir , habe ich übersehen.

@Robert :

 @Override
public void onCreate(SQLiteDatabase sqLiteDatabase)
{
  sqLiteDatabase.execSQL(CREATE_TABLE);
}

— geändert am 30.08.2017, 10:58:21

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 38

30.08.2017, 11:02:06 via Website

Danke für die schnellen Antworten.
Habe jetzt diesen Befehl probiert:
CREATE TABLE IF NOT EXISTS HALLO ( _ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, VALUE TEXT )
Leider bekomme ich bei den anderen Befehlen immernoch die Meldung zurück, dass HALLO nicht existiert.

Das in dem onCreate kein Table erstellt wird ist eigentlich meine Absicht, der soll erst nach eingabe meines Befehls zur Laufzeit erstellt werden, oder geht das nicht so einfach?
Falls nicht: Wie geht das? ^^

Antworten
  • Forum-Beiträge: 38

30.08.2017, 11:28:55 via Website

Die Funktion "SendClick" wird ausgeführt, wenn man den Button zum Senden einer Nachricht drückt. Dort wird die Funktion "exec" von meinem DBHandler ausgeführt (direkt unter dem Try). In edInput steht zum Beispiel der CREATE-Befehl, wie ich ihn oben aufgeschrieben habe.
In Exec wird dann "rawQuery" von der Datenbank mit dem vom Benutzer eingegebenen Befehl ausgeführt. Im Prinzip müsste es also dasselbe sein, wie wenn ich den Befehl direkt im Programmcode eintrage, nur halt nicht in onCreate, sondern erst später.

Ich habe es übrigens auch schon mit "execSQL" anstatt "rawQuery" probiert, hat aber leider auch nicht geholfen.

Jetzt ist mir gerade aufgefallen, dass ich in der Zeile über dem rawQuery "getReadableDatabase" stehen habe, habe das in "getWritableDatabase" geändert, scheint aber nichts zu ändern. :-(

Muss ich vielleicht irgendwelche Freigaben von Android einholen, bevor ich Datenbanken nutzen kann?

Antworten
  • Forum-Beiträge: 2.902

30.08.2017, 11:37:28 via Website

a) was spricht denn dagegen das OnCreate zu benutzen ? dann isse halt leer
b) Eigentlich müsstest du schon Exceptions bekommen , wenn die DB nicht angelegt wird ,
was sagen denn deine e.toStrings() im Log ?
c) natürlich musst du unter >= M deine Schreibberechtigung beim Device anfordern

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 38

30.08.2017, 12:55:35 via Website

a) In meinem Programm wird der Benutzer ja nach belieben Tables hinzufügen können, da bringt es ja nichts, wenn ich im onCreate irgendwas vorgebe. ^^ Habe es aber ausprobiert und den selben Fehler bekommen.
b) Das wundert mich auch, dass beim create table keine Exception kommt
c) Hat jetzt auch ohne funktioniert ;-)

Also ich habe mal ein bisschen rumprobiert und das auslesen des Cursors in meine Exec-Function gesetzt, jetzt funktioniert es wie es soll. Anscheinend hing die Exception, die ich bekommen habe, mit dem auslesen des Cursors zusammen und nicht mit der Datenbank an sich...
Naja, hauptsache es geht jetzt. Muss mir jetzt nur noch überlegen, wie ich die Tabellen am besten darstelle.

public String exec(String command) {
        String answer="";
        SQLiteDatabase db=this.getWritableDatabase();
        Cursor cursor=db.rawQuery(command,null);
        if(cursor.moveToFirst()) {
            answer=cursor.getString(0);
        }
        db.close();
        return(answer);
    }

Antworten

Empfohlene Artikel