2016-08-05 36 views
0

Ich erhalte diesen Fehler, wenn ich versuche, einen Datensatz aus der Datenbank zu löschen. Hier ist der Fehler in vollerandroid.database.sqlite.SQLiteException: in der Nähe von ";": Syntaxfehler (Code 1):

FATAL EXCEPTION: main 
                       Process: itp231.dba.nyp.com.bloommain, PID: 12274 
                       android.database.sqlite.SQLiteException: near ";": syntax error (code 1): , while compiling: DELETE FROM events WHERE id= ; 
                        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
                        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887) 
                        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498) 
                        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
                        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
                        at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
                        at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674) 
                        at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605) 
                        at itp231.dba.nyp.com.bloommain.EventInformationPage$1.onClick(EventInformationPage.java:135) 
                        at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:163) 
                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                        at android.os.Looper.loop(Looper.java:148) 
                        at android.app.ActivityThread.main(ActivityThread.java:5417) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

im Protokoll der Suche, es wies mich auf diese Linie von Codes (mein deleteRecord() -Methode -

private void deleteRecord() { 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
    alertDialogBuilder.setMessage("Are you sure you want delete this person?"); 

    alertDialogBuilder.setPositiveButton("Yes", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
        String id = editTextId.getText().toString().trim(); 

        String sql = "DELETE FROM events WHERE id= " + id + ";"; 
        db.execSQL(sql); 
        Toast.makeText(getApplicationContext(), "Record Deleted", Toast.LENGTH_LONG).show(); 
        c = db.rawQuery(SELECT_SQL,null); 
       } 
      }); 
+3

Lesen Sie Ihre Stack-Trace. Die 'String ID' ist leer, was bedeutet, dass' EditText' leer ist oder nur Leerzeichen hat. –

+0

Was ist der Typ der ID in der Datenbank und auch wenn Sie Wert übergeben – Aditi

+0

Ich bin mir nicht sicher, aber vielleicht könnte es auch ein Problem mit der Instant Run-Funktionalität sein, wenn Sie Android Studio verwenden. – ninjaxelite

Antwort

3

- Ihre ID ist eine leere Zeichenfolge, daher kann sie in Ihrem SQL-Befehl nicht analysiert werden.
- Wenn Ihr ID-Feld ein TEXT (???) ist, müssen Sie es in einfache Anführungszeichen setzen.
- Für SQL-Befehle verwenden execSQL() statt rawQuery()-rawQuery() funktioniert nur auf ... Anfragen (SELECT)
- Und ... Prepared Statements (oder gebundener Parameter) sind eine bessere Wahl. Die Platzhalter (?) werden automatisch in ihrer Reihenfolge ersetzt und die Anführungszeichen werden kein Problem mehr sein (Android wird das für Sie übernehmen!).

+0

gut durchdacht. –

+1

@IntelliJAmiya Danke, Schatz! –

+2

Zusätzlich dazu - NIEMALS SQL-Code auf diese Weise schreiben. Sie sind WIDE für einen SQL-Injection-Angriff geöffnet. * IMMER * Bindevariablen verwenden.Das Schreiben von Abfragen mit verketteten Parametern ist ein schrecklicher, schrecklicher Fehler. –

1

Sie können prepared statements

SQLiteStatement stmt = db.compileStatement("DELETE FROM events WHERE id = ?"); 
stmt.bindString(1, id); 
stmt.execute(); 
+1

Hat niemand von SQL-Injection gehört und weiß, warum dieser Code komplett fehlerhaft ist? Wenn Sie nicht ausgehen und studieren. Wenn ja, warum lehrst du ihm dann nicht den richtigen Weg? –

-1

Eine SQLite-Ausnahme, die anzeigt, dass beim SQL-Parsing oder der Ausführung ein Fehler aufgetreten ist.

Fügen Sie diese statt Ihrer " WHERE id= '" + id +"'";. Stellen Sie sicher, + id + hat einen Wert und vermeiden Sie zusätzlichen Platz.

Dann Clean-Rebuild und deinstallieren Sie Ihre alte App und führen Sie erneut.

+3

Oder noch besser - schreibe keinen solchen Code. Verwenden Sie Bindevariablen. COncatenating Parameter wie folgt ist eine SQL-Injektion warten auf –

+1

@GabeSechan. Ja stimmt. Aber sind Sie in einer lokalen App besorgt über Hackerangriffe? Ich meine, wenn die App nicht auf einem Server läuft (ich bezweifle sehr, dass Sie SQLite sowieso für Big Data verwenden), aber nur auf Ihrem Gerät, sind die Chancen größer als niemand, aber Sie können es verwenden. ;) –

-1

Sie können auch die Sugar ORM-Bibliothek verwenden, um DB-Aktionen zu erleichtern.

0

versuchen, dies ..

db.delete("events","id=?",new String[]{Integer.toString(id)}); 

, in dem

first paramater -> will be table name from where the deletion of data need to de done. 
Second parameter -> Selection field in table.based on which field we are going to perform the deletion 
Third parameter -> specifies the value,to be compare it with second paramters field if it is matched,then the particular column will be deleted.