2016-08-05 13 views
0

データベースからレコードを削除しようとしているときにこのエラーが発生します。ここでは、ログを見てみると、フルandroid.database.sqlite.SQLiteException: ";":構文エラー(コード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) 

に誤りがあり、それはコード(私のdeleteRecord()メソッドの次の行に私を向ける - あなたが使用することができます

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

があなたのスタックトレースを読みます。 'String id'は空です。これは、' EditText'が空であるか、空白だけがあることを意味します。 –

+0

データベース内のIDのタイプは何ですか?また、値 – Aditi

+0

を渡しているときは確かですが、Androidスタジオを使用している場合はInstant Run機能に問題があるかもしれません。 – ninjaxelite

答えて

3

- あなたのIDは空の文字列なので、SQLコマンドでは解析できません。
- あなたのidフィールドがTEXT(???)の場合は、一重引用符で囲む必要があります。
- SQLコマンドの場合は、代わりにrawQuery()execSQL()を使用 - rawQuery()だけで...クエリ作品(SELECT
- そして...準備された文(またはバインド変数)がより良い選択です。プレースホルダ(?)は自動的に置き換えられ、見積もりは問題になりません(Androidで処理されます)。

+0

は精巧です。 –

+1

@IntelliJAmiyaありがとう、よろしく! –

+2

これに加えて、このような方法でSQLコードを書かないでください。あなたは、SQLインジェクション攻撃を広く受けています。 *常にバインド変数を使用します。パラメータを連結したクエリを書くことは恐ろしい、恐ろしい間違いです。 –

1

prepared statements

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

誰もSQLインジェクションについて聞いたことがありません。なぜこのコードに完全な欠陥があるのか​​を理解していますか?あなたが外出して勉強していないなら。あなたが持っている場合、なぜあなたは彼にこれを行う正しい方法を教えていないのですか? –

-1

のSQL解析または実行中にエラーが発生したことを示すSQLite例外。

あなたの代わりにこれを追加してください" WHERE id= '" + id +"'";+ id +に値があり、に余分なスペースがないことを確認してください

次に古いアプリをクリーンリビルドしてアンインストールし、もう一度を実行してください。

+3

それ以上の場合、このようなコードは一切書かないでください。バインド変数を使用します。このようなパラメータをCOncatenすると、SQLインジェクションが発生するのを待って –

+1

@ GabeSechanになります。そうですね。しかし、地元のアプリでは、あなたはハッカーの攻撃を心配していますか?私は、アプリケーションがサーバー上で実行されない場合(私は非常に大きなデータのためにSQLiteを使用することを非常に疑う)、あなたのデバイスでのみ、チャンスは誰よりも、あなたはそれを使用することができます。 ;) –

-1

また、Sugar ORMライブラリを使用してDBの操作を簡単にすることもできます。

0

これを試してみてください。..における

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

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. 
関連する問題